在c++中查找大素数:我的整数在哪里溢出

Finding a large prime in C++: where does my integer overflow?

本文关键字:我的 整数 在哪里 溢出 c++ 查找      更新时间:2023-10-16

我用c++编写了一个计算大素数的Atkin筛的实现。它可以很好地找到10^8个素数,但是当试图找到10^9个素数时,我得到了一个不正确的结果。

看起来我正在处理一个整数溢出,但是我不知道这是怎么可能的。我到处使用uint64_t,期望的结果(22801763489)介于2^34和2^35之间。

我得到的结果是1326927009

相关代码如下:

uint64_t getPrimesAtkin(uint64_t Nn)
{
    (...)
}

int main(int argc, char** argv) {
    for (int a = 7; a < 10; a += 2)
    {
        clock_t begin = clock();
        uint64_t prime = getPrimesAtkin(pow(10,a));
        clock_t end = clock();
        printf("p(10^%d)=%12d t=%4.3fn",a,prime, double(end - begin) / CLOCKS_PER_SEC);
    }
}

我没有仔细阅读您的所有代码,但仅这一行就可以解释您的问题:

printf("p(10^%d)=%12d t=%4.3fn",a,prime, double(end - begin) / CLOCKS_PER_SEC);

这里您使用"%12d"格式将64位素数传递给printf()函数。该格式期望一个类型为int的参数,而不管用于输出的位数是多少。要打印long long(保证至少64位),使用"ll"修饰符("%12lld")并通过强制转换(long long)prime传递素数。

相关文章: