这道题考的是一个深度搜索,首先通过题意可以剪枝,最高位只有2、3、5、7,后面的低位都是只有1、3、7、9。然后进行深度搜索,ans作为每轮的质数,直到ans的位数与n相等时,输出ans。输出后,需要将ans回退到上一次ans的值,因此需要借助一个last变量使得ans回退到上一轮的值。代码如下。
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int LEN = 1;
int n=0;
int aa[5]={0,2,3,5,7},bb[10]={0,1,3,7,9};
int sjudge(int x){
int y=0,i=0;
y=sqrt(x);
for (i=2;i<=y;i++){
if (x%i==0){
break;
}
}
if (i>=y+1){
return 1;
}
return 0;
}
void dfs(int ans){
int x = ans/LEN;
if (x>0&&x<10){
cout<<ans<<endl;
return ;
}
for (int x2=1;x2<=4;x2++){
int last=ans*10+bb[x2];
if (sjudge(last)){
dfs(last);
}
}
}
int main (){
freopen ("sprime.in","r",stdin);
freopen ("sprime.out","w",stdout);
int x1=0,x2=0,k=0;
cin>>n;
for(int i=0;i<n-1;i++){
LEN *= 10;
}
if (n==1){
for (x1=1;x1<=4;x1++){
cout<<aa[x1]<<endl;
}
}
else {
for (x1=1;x1<=4;x1++){
k=aa[x1];
dfs(k);
}
}
return 0;
}