展开全部
每个判断一次62616964757a686964616fe59b9ee7ad9431333332643836 次数太多 所以超时
找规律
对于任意的完全素数 其去掉最后一位肯定也是完全素数(定义使然)
所以每个n位(n>1) 的完全素数 必然是由一个n-1位的完全素数派生出来的
所以只要知道k位上的所有完全素数,那么推导下一层就简单了,不需要所有数字都判断一次
作为一个素数 在n>1情况下(至少两位数) 其个位数只能是 1 3 7 9中的一个(偶数自然不是质数,而是5的话 可以被5整除 也不是质数)
这样程序可以简化为#include
#include
using namespace std;
bool isPrime(int v)
{
int i;
//特制质数判断函数,只判断奇数 因为不可能有v是偶数情况被调用
for(i = 3; i <= sqrt(v); i += 2)
if(v%i == 0) return false;
return true;
}
void get(int **list, int n)
{
if(n == 1)
{
list[0] = new int[5];
list[0][0] = 4;
list[0][1] = 2;
list[0][2] = 3;
list[0][3] = 5;
list[0][4] = 7;
}
else
{
int i, j;
int a[4] = {1,3,7,9};
int v;
n --;
/*
稳妥的做法是上一层总数*4 +1
实际运行可以发现 最多只有16个(4位的时候)
所以这里可以固定为17
i = list[n-1][0] * 4 + 1;
list[n] = new int[i];
*/
list[n] = new int[17];
list[n][0] = 0;
for(i = 1; i <= list[n-1][0]; i ++)
{
for(j = 0; j
{
v = list[n-1][i] * 10 + a[j];
if(isPrime(v))
list[n][++list[n][0]] = v;
}
}
}
}
int main()
{
int **list, i, n;
list = new int *[8];
for(i = 1; i
get(list, i);
cin >> n;
n --;
for(i = 1; i <= list[n][0]; i ++)
cout <
return 0;
}