求幸运数

问题重现:

如果一个数各个数位上的数字是质数(规定:假设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]);
	}*/
}

点赞