程序为特定输入提供了错误的输出

program giving wrong output for a specific input

本文关键字:错误 输出 输入 程序      更新时间:2023-10-16

我想检查一个数字是素数。这是我的代码:

#include <iostream>
using namespace std;
int main(){
    int num;
    int i, k = 0;
    cin >> num;
    for(i = 2; i < num; i++){
        if(num % i == 0){
            k = k + 1;
        }
    }
    if(k > 0){
        cout << "The number is not prime" << endl;
    }else{
        cout << "Prime!" << endl;
    }
    return 0;
}

当我输入6、78,...等时,它给出了正确的输出。但是,当我输入不是素数的4294967296时,它正在返回Prime!

那是因为 4294967296是一个相当特殊的数字。它是2^32,它是int的存储容量的限制,通常仅容纳32位。因此,您的num被解释为0

其余的从溢出误解中逻辑上遵循。for循环永远不会输入,因为2不少于0,因此k永远不会增加。

edit 实际上,在这种特殊情况下,它出于不同的原因失败。std::cin在输入上执行截断,因此,当您输入4294967296时,num实际上将被分配给2147483647的值。您的程序[正确]打印该值是主要的。只是那不是用户打算测试的数字。

您需要验证输入。4294967296对于32位签名的整数太大,因此std::cin将其截断为2147483647,实际上是PRIME的。您可以检查将您的电话号码打回屏幕。您还应该将循环更改为:

for(i = 2; i < num / 2; i++)

,它将提供相同的结果,但减少计算时间两次。