题解 P1218

这道题是典型的打表题。

以下给出非常简洁的数据生成程序。

#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;
}

猜你喜欢

转载自www.cnblogs.com/s-t-a-r-d-u-s-t/p/11436774.html