求下一个质数程序触发超时执行错误,寻求排查方案
质数求解程序超时问题分析
需求说明
输入质数时输出下一个质数,输入非质数则终止程序。
提交的C++代码
#include <iostream> using namespace std; int nextprime (int); bool primality (int); int main () { int a; cin >> a; bool prime = primality(a); while (prime) { cout << nextprime(a) << endl; cin >> a; prime = primality(a); } } int nextprime (int x) { ++x; if (x % 2 == 0 and x != 2) ++x; bool prime = primality(x); while (not prime) { x = x + 2; prime = primality (x); } return x; } bool primality (int x) { if (x % 2 == 0 and x != 2) return false; for (int number = 3; number*number <= x; number = number + 2) { if (x % number == 0) return false; } return true; }
超时原因及修复方案
核心问题:整数溢出导致死循环
primality函数中的循环条件number*number <= x存在严重缺陷:当x接近int类型的最大值时,number*number会溢出变为负数,此时循环条件永远为真,程序陷入死循环,直接触发超时。
修复方法:将循环条件改为(long long)number * number <= x,用64位整数存储乘法结果避免溢出;或者改用number <= x / number的形式,同样能避免溢出问题。同时补充x<=1的边界判断,原代码未处理这类输入,会误判1为质数,引发后续不必要的计算。
修正后的primality函数:
bool primality (int x) { if (x <= 1) return false; if (x == 2) return true; if (x % 2 == 0) return false; for (int number = 3; (long long)number * number <= x; number += 2) { if (x % number == 0) return false; } return true; }
次要问题:输入输出效率不足
在线判题系统中,cin和cout默认与C标准IO同步,速度较慢;且endl会强制刷新输出缓冲区,频繁调用会增加耗时。
修复方法:在main函数开头添加同步关闭代码,并用'\n'代替endl:
int main () { ios::sync_with_stdio(false); cin.tie(nullptr); int a; cin >> a; bool prime = primality(a); while (prime) { cout << nextprime(a) << '\n'; cin >> a; prime = primality(a); } }
内容的提问来源于stack exchange,提问作者diegoo_es
相关产品推荐
相关产品推荐

