问题重现:
如果一个数各个数位上的数字是质数(规定:假设10以内的质数有1、2、3、5、7),并且各个数位上的数字的平方和也是质数,则称它为幸运数。 给定x,y,求x,y之间( 包含x,y,即闭区间[x,y])有多少个幸运数。 例如1到20之间有4个幸运数,它们是11,12,14,16,像因为1+1 = 2是质数,1^2 + 1^2 = 2也是质数等等。求:1<=x<=y<=1000000000之间的幸运数。
#include<stdio.h>
#include<math.h>
int num[9];
int res[5000000];
int c=0;
/*检查是否是质数*/
int check(int n){
if(n==1 || n==2){
return 1;
}
int i,j=(int)sqrt(n);
for(i=2;i<=j;i++){
if( n%2==0 ){
return 0;
}
}
return 1;
}
/*列出所有组合*/
void list(int i,int n){
if(i==n){
//多少位的组合
int j,count=0;
for(j=0;j<9;j++){
count+=(int)pow(num[j],2);
}
if( check(count)==1 ){
//合格的数据填入res中
count=0;
for(j=0;j<9;j++){
count=num[j]+count*10;
}
res[c++]=count;
}
return;
}
num[i]=1;
list(i+1,n);
num[i]=2;
list(i+1,n);
num[i]=3;
list(i+1,n);
num[i]=5;
list(i+1,n);
num[i]=7;
list(i+1,n);
}
void main(){
int i;
//枚举出不同长度的组合
for(i=1;i<10;i++){
list(0,i);
}
printf("一共有%d个\n",c);
/*for(i=0;i<c;i++){
printf("%d\n",res[i]);
}*/
}