7331是一个特殊的质数,因为我们去掉个位得到的733是一个质数;再次去掉个位得到的73又是一个质数;再去掉个位后得到的7依然是一个质数。对于形似这种的质数,我们称呼它为特殊质数。
写一个程序对给定的待求特殊质数的位数 N (1≤N≤8)求出所有对应位数的特殊质数(注意:数字1不被看作一个质数)。
输入包括一个整数,为待求特殊质数的位数 N。
输出长度为N的特殊质数列表,每行一个。
样例输入
4
样例输出
2333
2339
2393
2399
2939
3119
3137
3733
3739
3793
3797
5939
7193
7331
7333
7393
#include <iostream>
#include <string>
#include <cstring>
#include <stdio.h>
#include <cmath>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
long long d[9][1000];
char a[100005];
int main()
{
int run(int);
memset(a,'0',sizeof(a));int i,j,k,l;
for(i=2;i<=sqrt(100001);i++)
{
for(int j=i*i;j<=100000;j=j+i)
{
a[j]='1';
}
}
memset(d,0,sizeof(d));
d[1][1]=2;
d[1][2]=3;
d[1][3]=5;
d[1][4]=7;
for(i=1;i<8;i++)
{
l=1;
for(j=1;d[i][j]!=0;j++)
{
for(k=1;k<10;k++)
{
if(run(d[i][j]*10+k)==1) {d[i+1][l]=d[i][j]*10+k;l++;}
}
}
}
int f;
while(cin>>f)
{
for(j=1;d[f][j]!=0;j++) cout<<d[f][j]<<endl;
}
}
int run(int t)
{
if(t<100000)
{
if(a[t]=='1') return 0;
else return 1;
}
else
{
int z=1;
int i;
int q=sqrt(t);
for(i=2;i<=q;i++)
if(a[i]=='0'&&t%i==0)
{
z=0;
break;
}
if(z==1) return 1;
else return 0;
}
}