c++ 终止 超时_c++超时问题

展开全部

每个判断一次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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值