c++ - 为什么大数输入会导致此代码计算 primeCounting 时产生运行时错误?

标签 c++ c++11 count runtime-error primes

任务是计算输入参数 N 以下的素数个数。 我正在用从小到大的不同输入数字测试这段代码。很奇怪,如果输入值大于和等于 46342,我只会遇到运行时错误。如果输入值小于 46342,代码运行完美,没有任何运行时错误。

int countPrimes(int n) {
    if (n <= 2) return 0;
    vector<bool> array(n,true);
    int cnt = 0;
    for (int i = 2 ; i < n ; i++)
    {
        for (int j = i ; i * j < n ; j++)
        {

            int product = i * j;
            if (array[product])
            {
                array[product] = false;
                cnt++;
            }
        }
    }
    return n - 2 - cnt;
}

如果输入大于等于 46342,我将看到“运行时错误 ",如果输入小于 46342,代码运行正常,结果正确。

最佳答案

这个:

int product = i * j;

将溢出,使 product 等于负数。

然后,您将尝试使用负索引访问array(实际上是一个 vector ,因此将其命名为array 不是一个好的选择),这将使你的程序崩溃了。


您需要使用可以支持更大数值的类型。现在您使用了 int ( C++ Integer Limits )。将 unsigned int 用于 nijproduct

关于c++ - 为什么大数输入会导致此代码计算 primeCounting 时产生运行时错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53885738/

相关文章:

c++ - 错误 : cannot pass objects of non-trivially-copyable type through `...`

c++ - 即使一切看起来都是 "good", std::mutex::lock 也会抛出吗?

c++ - QVariant vs boost::any vs boost::variant

c++ - 为什么必须使用函数指针?

c++ - 显示帕斯卡三角形的第 n 行

c++ - 使用 shared_ptr 和 glutInit 导致段错误

java - 返回低于平均值的数字数量

SQL:计算值的出现次数

mysql - 使用 Count 连接 3 个表

c++ - friend 说明符如何在 C++ 中工作?