題目
質數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;
}