这道题目意思很简单,关键在于解决素数判定的耗时和打表产生的空间问题。
可以发现的第一个关键点,即每一位的sprime都基于上一位的sprime,而下一位对前一位无后效性影响。所以可以从位数由低到高,动态规划地产生一层层的解。
最后查询目标位数的解即可。
动态规划的过程可以由迭代来实现。它的来源是递归的问题描述,换句话讲就是bfs的搜索过程。
递归搜索的代码如下:
迭代代码:void sprime(int n, int ndigit) { if(ndigit == 0) { fprintf(fout, "%d\n", n); return; } n *= 10; if(isprime(n+1)) sprime(n+1, ndigit-1);//如果n+1是sprime就去找(n+1)的下一层即(n+1)*10+1,3,7,9是不是质数,一直搜索到位数截止。 if(isprime(n+3)) sprime(n+3, ndigit-1); if(isprime(n+7)) sprime(n+7, ndigit-1); if(isprime(n+9)) sprime(n+9, ndigit-1); }
for(i=2;i<=n;i++)//sprime设定成2维数组,每一行首位元素表示该行的sprime个数。n表示位数。
{
int l=1;
for(j=1;j<=sprime[i-1][0];j++)
{
for(k=1;k<=9;k+=2)
{
int temp=su[i-1][j]*10+k;
if(isprime(temp))
sprime[i][l++]=temp;
}
}
sprime[i][0]=l-1;
}