2015-03-03 49 views
2

我是一名java學生,我剛開始使用project euler來讓我練習代碼寫作並只是輸入一般信息。我目前停留在第7個問題上,無法找到我的代碼出了什麼問題。試圖找到Java中的10,001st素數(歐拉項目)

 public static void main(String[] args) 
    { 
     int num, remainder, divisor; 
     boolean working = true; 
     num = 2; 

    for(int count = 0; count <= 10001; count++) 
    { 

     divisor = num - 1; 
     remainder = 1; 
     working = true; 

     while(working != true) 
     { 
     remainder = 1; 
     divisor = num - 1; 

     while(remainder!=0) 
     { 
      remainder = num%divisor; 

      if(divisor==1); 
      {working = false;} 

      divisor--; 
      } 
     num = num++; 
     } 
    } 
    //System.out.println(num -1); 
    } 

我得到的輸出是1,我找不出原因。我對編碼非常陌生,所以請不要在我的代碼瘋狂,如果它是糟糕和低效的LOL。

+0

題外話,但你檢查素數的方法是非常低效的。 1,n很難不被n-1整除。第二,你不需要檢查甚至除數。3,你甚至不需要檢查從1到n-1的所有除數,只有從1到sqrt(n)就足夠了 – 2015-03-03 07:54:44

+0

我做了這樣一次。如果你堅持你已經找到的素數,你只需要檢查這些數字。 – Jake 2015-04-06 13:58:07

回答

1

以下是在您的代碼中導致意外的結果。

if(divisor==1); 
    {working = false;} // Note: {...} is a statement block and statement 
         // blocks do not need a terminating semicolon, this 
         // can be problematic because no syntax errors will 
         // occur 

更改爲:

if(divisor==1) { 
     working = false; 
    } 

在if語句的結束分號使有條件的是一個空語句。

空語句

空語句什麼也不做。空語句的

EmptyStatement: 
    ; 

執行始終正常完成

更多信息可以在這裏找到:Semicolon at end of if statement.

+0

Omg我不敢相信我錯過了,謝謝! – Forev3r 2015-03-03 18:37:31

0

歐拉的目的是寫一個快速執行儘可能代碼。如果我沒有記錯,那麼你的代碼應該少於一分鐘就能找到答案。

話雖如此,應該知道偶數(2除外)不是素數。所以你可以有一個從1開始的素數運行計數,並且每當你確定一個素數時就增加。然後你有另一個計數數字,從3開始,這個計數數字,你必須執行檢查,看看它的素數和增加你的素數如果是真的。無論如何,如果該號碼是質不是你想2.

你應該控制運行,直到你的黃金數量達到10001

沒有給你的代碼直接回答循環來增加這個數字,這裏的一些僞代碼,讓你去:

int primeCounter = 1; 
int number = 3; 

while (primeCounter < 10001) 
{ 
    if (number is prime) 
    { 
     primeCounter++; 
    } 

    // Increment by 2, because we're only going to check odd numbers for prime 
    number += 2; 
} 

// This will be your 10001st prime number 
output number