0

小于 10,000,000 的素数数量为 664,579,但我的代码仅生成 664,214。数字来源是https://primes.utm.edu/howmany.html

#include <iostream>
#include <bitset>
#include <vector>
using namespace std;

const int N = 10000001;
bitset<N>num;
vector<int>prime;
inline void sieve()
{
    num.flip();
    num[0] = num[1] = 0;
    for(int i=2;i<N;i++)
        if(num[i])
        {
            prime.push_back(i);
            for(long long unsigned j=i*i; j<N;j+=i)
                num[j] = 0;
        }
}

int main() {
    sieve();
    cout << prime.size() << endl;
    return 0;
}
4

1 回答 1

4

计算时出现整数溢出i*i。然后将结果分配给 long long 的事实不会使编译器在乘法之前提升类型。

如果我声明i为 along long unsigned int那么你的程序输出 664579

于 2014-11-04T12:35:55.593 回答