1、49 我素故我在
作者: xxx时间限制: 1S章节: 深度优先搜索
2、问题描述 :
有这样一种素数叫纯素数(YY出来的名字),当它是一个多位数的时候,你把它的末位去掉之后余下的数依然是一个素数。比如说2393,2393 本身是一个素数,它的末位去掉之后,余下的是239。239 是一个素数,它的末位去掉之后,余下的是23 。23是一个素数,它的末位去掉之后,余下的是2 。2依然还是一个素数。纯素数的长度叫做“维”。2393 是一个4维素数。3797也是一个4维素数。
输入说明 :
第一行先给出一共有多少组数据N(N<=1000),接下来有N组数据.
每组包括一个整数T(1<=T<=8)。
输出说明 :
按照从小到大的顺序输出所有的T维纯素数。
输入范例 :
3
8
1
4
输出范例 :
23399339
29399999
37337999
59393339
73939133
2
3
5
7
2333
2339
2393
2399
2939
3119
3137
3733
3739
3793
3797
5939
7193
7331
7333
7393
3、代码实现
#include<stdio.h>
#include<math.h>
int primeNums[9][1000];
int len[9]={0};
int primeNumber(int n);
void DFS(int num,int dimension,int count);
int main(){
int n,t,i;
for(i=2;i<10;i++){
if(primeNumber(i)){
DFS(i,1,++len[1]);
}
}
scanf("%d",&n);
while(n--){
scanf("%d",&t);
for(i=1;i<=len[t];i++){
printf("%d\n",primeNums[t][i]);
}
}
return 0;
}
int primeNumber(int n){
if(n<=1){
return 0;
}
for(int i=2;i<=sqrt(n);i++){
if(n%i==0){
return 0;
}
}
return 1;
}
void DFS(int num,int dimension,int count){
int i;
if (dimension > 8) {
return ;
}
primeNums[dimension][count]=num;
for(i=1;i<10;i++){
if(primeNumber(10*num+i)){
DFS(10*num+i,dimension+1,++len[dimension+1]);
}
}
}
4、总结
第一版代码
#include<stdio.h>
#include<math.h>
int primeNumber(int n){
if(n<=1){
return 0;
}
for(int i=2;i<n;i++){
if(n%i==0){
return -1;
}
}
return 1;
}
int main(){
int i,n,t,threshold,start,temp,flag,num;
scanf("%d",&n);
while(n--){
scanf("%d",&t);
start=1;
threshold=1;
for(i=0;i<t;i++){
if(t-2>=0&&i<=t-2){
start*=10;
}
threshold*=10;
}
for(i=start;i<threshold;i++){
temp=primeNumber(i);
if(temp!=1){
continue;
}
flag=0;
num=i;
while(temp>0){
if(num>=10){
num/=10;
}
temp=primeNumber(num);
if(num<10&&temp==1){
flag=2;
break;
}
if(temp!=1){
flag=1;
break;
}
}
if(flag==2){
printf("%d\n",i);
}
}
}
return 0;
}
结果:
前5维还可以,到第6维,明显吃力,到第7维,卡死,,,这种方法不行,
5、参考文献
1、http://www.cnblogs.com/Lvsi/archive/2011/05/17/2048746.html
2、https://blog.csdn.net/qq_41409120/article/details/104593928