问题描述 :
有这样一种素数叫纯素数(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
问题分析:
显然用暴力的方法做不了这么大的数,选用深度优先的策略解决,每次添加一位,选择从前往后添加(从后往前应该也行,不过不太方便)。显然首位应该为2,3,5,7。
具体代码:
#include <iostream>
#include<iomanip>
#include <cmath>
#include<bits/stdc++.h>
#include <stack>
#include<string>
using namespace std;
int m;
//判断是不是素数
bool sushu(int m){
int k=(int)sqrt( (double)m );
for(int i=2;i<=k;i++)
if(m%i==0)
return false;
return true;
}
//逐位添加,第一个参数为位数,第二个为当前添加过后的值
void construct(int n,int result){
//递归返回条件,位数达到了就返回
if(n==m-1)
cout<<result<<endl;
else{
//控制添加的数,后边每一位添加的可能是0-10
for(int i=0;i<10;i++){
result=result*10+i;
//判断是不是素数,然后换下一个i。
if(sushu(result))
{
//如果当前结果为素数就继续往下递归
construct(n+1,result);
}
//添加过之后应该对原来的结果回溯加入添加了i=0,20
//下一位i=1,为21,计算过之后应该还原原来的值。
result = (result-i)/10;
}
}
}
int main()
{
int k;
int t=0;
cin>>k;
while(t<k){
int a[4]={2,3,5,7};
cin>>m;
for(int i=0;i<4;i++)
construct(0,a[i]);
t++;
}
return 0;
}