在C和C++中编写代码的不同值

Shu*_*ham 2 c c++ algorithm printf

我正在解决一个问题,找到所有素数的总和,直到200万,在C中.我一直得到错误的答案(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);
}
Run Code Online (Sandbox Code Playgroud)

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

aut*_*tic 11

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

int是不适合存储值的类型20000000; 实现不需要能够表示超出-3276732767使用的值int.您可能希望i并且j成为unsigned long(适合表示最高的正值0xFFFFFFFFUL)或unsigned long long(适合表示最高的正值0xFFFFFFFFFFFFFFFFULL).如果您正在使用超出该值的值,则可能需要考虑使用任意精度算术库,例如gmplib.

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

  • 在C++中无效,但在技术上不在C中.C11允许它以"其他一些实现定义的方式"(第5.1.2.2.1/1节)定义,尽管我仍然不会在那里使用`void main`, .并且`int`适用于2000万,除非你的`int`是16位或者什么东西,这实际上根本不常见.其他人至少和你说的一样大. (3认同)
  • 请不要告诉我你花时间让每个程序与所有可能的配置完全兼容,过时与否.如果你的系统是16位的,请继续为此制作程序.如果您正在与其他某些旧机器一起工作,请继续并将每个人与三字母混淆,以使其与键盘兼容.除非你处于特定情况,否则你真的不需要担心. (3认同)
  • 我没有反对可移植性.我自己提倡,比如知道字母不必是连续的.我觉得很高兴知道`int`可以只有16位(你应该知道如果你需要编写你的代码),我绝对不认为`void main`会让你在任何地方托管平台.对于几乎任何人来说,"int"很可能不会*小于32位,尽管你也可以反对ASCII假设.谁知道,当我考虑到32位值时,也许我会开始使用`long`而不是`int`. (3认同)