歐拉計劃004 質數組合

題目

質數3, 7, 109, 和 673是值得注意的。將其中任意兩個質數以任何順序相連接產生的結果都是質數。 例如,取7和109,連接而成的7109和1097都是質數。這四個質數的和是792,這也是滿足這個性質的四個質數集合的最小總和。找出滿足這個性質的五個質數的集合中,集合數之和最小的。算出這個最小的和。

解題思路

直接根據題意來實現就可以了。

程序代碼

#include <cstdio>
#include <cmath>
#include <cstring>
#define N 1000010
int a[10010],b[N];

void prime(int n){		//素數篩法 
	int i,j,m;
	for(i=0;i<=n;i++)
		b[i]=1;
	b[0]=b[1]=0;
	m=(int)sqrt(n);
	for(i=1;i<=m;i++)
		if(b[i])
			for(j=2*i;j<=n;j+=i)
				b[j]=0;
}
int f(int n,int m,int c,int d,int e){
	int l[10],s[10];
	l[1]=log10(n);
	l[2]=log10(m);
	l[3]=log10(c);
	l[4]=log10(d);
	l[5]=log10(e);
	s[1]=n;s[2]=m;s[3]=c;s[4]=d;s[5]=e;
	int i,j,mm=0;
	for(i=1;i<=5;i++){
		for(j=1;j<=5;j++){
			if(j==i) continue;
			for(int k=0;k<l[j];k++)
				mm*=10;
			int h=s[i]*mm+s[j];
			if(!b[h])
				return 0;
		}
	}
	return 1;
}

int main()
{
	int i,j,k;
	int x,y,z,l,m;
	prime(N);
	j=0;
	for(i=0;i<N;i++){
		if(b[i])
			a[j++]=i;
		if(j==10000)
			break;	
	}
	for(x=0;x<1000;x++){
		for(y=0;y<1000;y++){ if(y==x) continue;
			for(z=0;z<1000;z++){ if(z==y||z==x) continue;
				for(l=0;l<1000;l++){ if(l==z||l==y||l==x) continue;
					for(m=0;m<1000;m++){ if(m==l||m==z||m==y||m==x) continue;
						if(f(a[x],a[y],a[z],a[l],a[m])){
							printf("%d %d %d %d %d\n",a[x],a[y],a[z],a[l],a[m]);
							printf("%d\n",a[x]+a[y]+a[z]+a[l]+a[m]);
							return 0;
						}
					}	
				}
			}
		}
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章