这道题是典型的打表题。
以下给出非常简洁的数据生成程序。
#include<bits/stdc++.h>
using namespace std;
bool ido(int x)
{
if(x==1)
return 0;
if(x==2)
return 1;
for(int i=2;i<=sqrt(x);i++)
if(x%i==0)
return 0;
return 1;
}
bool judge(int x)
{
while(x)
{
if(!ido(x))//判质数.不用多说.
return 0;
x/=10;//切下肋骨.
}
return 1;
}
int main()
{
for(int i=1;i<=99999999;i++)//枚举范围内所有数再判定.
if(judge(i))//判定.
cout<<i<<',';//输出.
return 0;
}
程序跑了好几分钟。虽然有点小慢,但是还是很方便的。就算碰到更刁钻的数据,也可以对数据生成程序做各种简易的优化。比如,这里就没必要枚举以非质数开头的数。还有我们可以用更快的质数表来判断。由于题目只有这么难,这里不多说。
接下来写好输出程序。用了一些打表常用的小技巧。
#include<bits/stdc++.h>
using namespace std;
int l[9][20]={{},{0,2,3,5,7},{0,23,29,31,37,53,59,71,73,79},{0,233,239,293,311,313,317,373,379,593,599,719,733,739,797},{0,2333,2339,2393,2399,2939,3119,3137,3733,3739,3793,3797,5939,7193,7331,7333,7393},{0,23333,23339,23399,23993,29399,31193,31379,37337,37339,37397,59393,59399,71933,73331,73939},{0,233993,239933,293999,373379,373393,593933,593993,719333,739391,739393,739397,739399},{0,2339933,2399333,2939999,3733799,5939333,7393913,7393931,7393933},{0,23399339,29399999,37337999,59393339,73939133}};
int num[9]={0,4,9,14,16,15,12,8,5};//这个数组用来表示不同n值时解的数量.
int main()
{
int n;
cin>>n;
for(int i=1;i<=num[n];i++)
cout<<l[n][i]<<endl;
return 0;
}
原文:https://www.cnblogs.com/s-t-a-r-d-u-s-t/p/11436774.html