2014-01-18 27 views
0

它應該打印142,913,828,922,(而不是1179908154它是怎麼做的......) 有什麼不對?找到200萬以下所有素數的總和。爲什麼我的代碼不工作?

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(); 
} 
+0

問題' 「%d」'和'長long'應該由你的編譯器警告。確保您的編譯器警告已完全啓用。 – chux

回答

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 < 2^32) 。

+1

'可變和的大小是8個字節':沒有必要! – haccks

+0

嗯,真的,不一定。但在這個特定的情況下,它可能是... –

+1

否改變它; * long long類型的正確說明符是'%ld'。使用錯誤的說明符會調用未定義的行爲*。大小是實現定義的。 – haccks

3

錯誤在於行:

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

應該是這樣:

printf ("%lld\n", sum); 
相關問題