2

我正在解决一个问题,在 C 中找到所有素数的总和直到 200 万。我不断得到错误的答案(1179908154),但是当我用 C++ 编写相同的代码时,它给出了正确的答案(142913828922)。请告诉我为什么会这样,谢谢。

这是我的代码

void main()
{
    int i,j;
    unsigned long long sum;

    for(sum=2,i=3;i<=2000000;i+=2)
    {
        for(j=3;j*j<=i;j++)
            if(i%j==0)
                break;
        if(j*j>i)
            sum+=i;
    }
    printf("%d",sum);
}

我在 Windows 7、32 位并使用 GNU GCC v4.7.1

4

2 回答 2

11

%d告诉printf期待一个int论点。sum是一个unsigned long long。这是未定义的行为。你可能想要printf("%llu\n", sum);.

int不适合将值存储到20000000; 实现不需要能够表示超出-3276732767使用int. 您可能希望iandj成为一个unsigned long(适合表示最大为 的正值0xFFFFFFFFUL)或一个unsigned long long(适合表示最大为 的正值0xFFFFFFFFFFFFFFFFULL)。如果您使用的值超出此范围,您可能需要考虑使用任意精度的算术库,例如gmplib

void main()不是 C 中的有效入口点。您可能想要int main().

于 2013-06-09T07:34:45.823 回答
1

i将and的类型更改jlong... 并%ld用作格式说明符。在 c 中,您的值跨越整数范围。

于 2013-06-09T07:38:58.797 回答