2013-10-28 61 views
-1
public static void main(String args[]) 
{ 
    long sum = 0; 
    for(int i=0; i<Integer.parseInt(args[0]); i++) 
    { 
     if(i != 1 && i%2 != 0 && i%3 != 0 && i%5 != 0 && i%7 != 0) 
     { 
      sum = sum + i;   
     } 
     if(i==2 || i==3 || i==5 || i==7) 
     { 
      sum = sum + i; 
     } 

    } 
    System.out.println(sum); 
} 

每當我插入100,它就會生成1060,這是正確的。但是,它會產生1,000,000個錯誤的號碼(114,285,285,737)。爲什麼我的程序爲100以下的所有素數的總和生成正確的輸出,但是不低於100萬?

對於100以下的所有值,它正確生成,沒有嘗試過其他任何東西。我不只是檢查100.

+2

這不是一個有效的方法來找到所有的素數 - 它會接受許多數字,而不是*素數。 – user2864740

+0

程序應該計算什麼?也許你應該在你的陳述中包含更多的素數,而不僅僅是1,2,3,5和7,以便爲更高的數字正確地得到答案。 – Ghostkeeper

+1

我看不到上面的程序如何檢查質數 – Prateek

回答

2

您需要將所有素數總和低於某個數。問題在於你對「素數」的定義是「數字2,3,5,7和所有不能用2,3,5或7分開而沒有餘數的數字」,這是不正確的。

素數的正確定義是「素數(或素數)是大於1的自然數,除1和它自身之外沒有正數除數。」 (維基百科)。因此,這需要你的測試,而不是你目前的測試。

如果1和數字本身之間的所有數字(都被排除在外)給出了除法餘數,那麼就有一個素數。

如果您更改程序以使用此定義,則應該得到正確的結果。

(和速度,你可以考慮,如果你真的必須測試所有號碼,或者如果您可以通過檢查只有一部分得到相同的結果)

(也是爲什麼它的工作原理高達100是因爲你只需要測試少於數字的平方根(這裏是10)的質數,而對於100就是2,3,5和7,這正是你的程序所做的)。

0

提示:你的問題將失敗的最小質數是11.知道11是一個素數。該系列繼續:2,3,5,7,11,13,17,19,23,...

+0

我的程序在11時不會失敗。如果我給出12的輸入(總和12以下的所有素數),它會生成28,即2 + 3 + 5 + 7 + 11。這並不正確。 – user2770254

+2

你不明白......我該如何解釋?試用11 * 11。 –

+0

我需要徹底重新思考我的解決方法嗎? – user2770254

3

您的方法涉及檢查從1到目標的平方根的所有素數,看看是否他們是你的目標範圍內每個數字的因素。

對於100的目標,這意味着查看1到100之間的每個數字,以查看它是否可以被範圍1到10(2,3,5)的素數整除。正如你所發現的,這是有效的。

對於1,000,000,您需要檢查1到1000之間的所有素數,以查看它們是否是每個數字在1到1,000,000之間的因子。您的代碼仍然只檢查1到10之間的素數。

爲了使您的代碼正常工作,請將您的列表擴展爲包含1到1000之間的所有素數 - 其中包含168個素數。

0

問題是與此條件:

if(i != 1 && i%2 != 0 && i%3 != 0 && i%5 != 0 && i%7 != 0) 

如其他人所說的那樣,不檢查一個數是素數的有效方法。你的程序出現的原因是因爲,例如,209不能被2,3,5或7整除,但209是11 * 19,這是而不是總數。

相關問題