You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求下一个质数程序触发超时执行错误,寻求排查方案

质数求解程序超时问题分析

需求说明

输入质数时输出下一个质数,输入非质数则终止程序。

提交的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 08:31:07