欧拉计划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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章