找出200万以下所有素数的总和。为什么我的代码不起作用?

时间:2014-01-18 19:41:31

标签: c numbers primes

它应该打印142,913,828,922,(而不是1179908154它是怎么做的......) 怎么了?

http://pastebin.com/gJL4cMxm#

#include <stdio.h>
#include <conio.h>
#include <math.h>

int main()
{
    int n=2000000;
    long long sum=0;
    int m;
    int i;
    for(i=2;i<n;i++)
    {
        for(m=2;m<=sqrt(i);m++)
        {
            if(i%m==0)
            {      
                break;
            }
        }
        if(m>sqrt(i))
            sum+=i;
    }
    printf("%d",sum);  
    getch();
}

2 个答案:

答案 0 :(得分:5)

更改:

printf("%d",sum);

printf("%lld",sum);

<强>解释

如果变量sum的大小为4字节或更小,则在调用printf之前,会将4字节数据压入堆栈。

如果变量sum的大小是8个字节,则在调用printf之前,会将8个字节的数据压入堆栈。

之后,printf("%d"...)将尝试从堆栈中读取4个字节的数据。

类型long long的大小在某些编译器(包括你的编译器)上是8个字节,因此print("%d",sum)仅打印sum的“下半部分”,这显然是错误的值在你的观点中(除非sum&lt; 2 ^ 32)。

答案 1 :(得分:3)

错误在于:

printf ("%d\n", sum);

应该是这样的:

printf ("%lld\n", sum);