2013-11-15 35 views
1

我必須找到10001st素數是104753,但是當我運行我的代碼時,我得到104754.小錯誤10001st素數java代碼?

我需要幫助查找問題。我可以改變什麼,以便找到10001的素數? 感謝

這是我迄今所做的:

public class Prime 
{ 

    public static void main(String[] args) 
    { 
     int a = 1; 
     int primes = 0; 

     while (primes < 10001) 
     { 
      if (isPrime(a) == true) 
      { 
       primes++; 
      } 

      a++; 
     } 

     System.out.println("The 10001st prime number is " + a); 
    } 

    public static boolean isPrime(int b) 
    { 
     boolean x = false; 
     int counter = 0; 

     for (int i=1; i<=b; i++) 
     { 
      if (b%i == 0) 
      { 
       counter++; 
      } 

      if (counter == 2 && i == b) 
      { 
       x = true; 
      } 
     } 

     return x; 
    } 
} 
+8

歡迎來到Stack Overflow!要求人們發現代碼中的錯誤並不是特別有效。您應該使用調試器(或者添加打印語句)來分析問題,追蹤程序的進度,並將其與預期發生的情況進行比較。只要兩者發生分歧,那麼你就發現了你的問題。 (然後,如果有必要,你應該構建一個[最小測試用例](http://sscce.org)。) –

+2

請使用正確的縮進,它使你的代碼更具可讀性! – Dragondraikk

+0

哪個素數不正確?我建議你打印出你的素數,看看它與已知的素數列表不同。順便說一句,你可以讓你的isPrime * *效率更高。 –

回答

2

在確定它是否爲素數後,可以增加'a'。

如果這是我的項目,我會先從:

a = 0; 

,然後在我的循環我會:

a++; 
if (isPrime(a)) { 
    count++; 
} 
4

右鍵找到號碼後,您增加它。

if(isPrime(a) == true) 
{ 
    primes++; 
} 
    a++; 

您應該在遞增之前打印它。

+0

在你增加它之前打印它意味着你需要檢查兩次退出條件'if(primes == 10001)'。這通常不是一個很好的技術。 – nelly

+0

@nelly沒錯。這不是最好的選擇,因爲他只想打印那個素數。我沒有考慮到這一點。 – broncoAbierto

2

一個簡單的解決方案:

int a = 0; 
int primes = 0; 
while(primes < 10001) { 
    a++; 
    if(isPrime(a) == true) { 
     primes++; 
    } 
} 

當然有還有很多其他人。 也許你也應該考慮更快的算法,發現素數:

http://www.wikihow.com/Check-if-a-Number-Is-Prime

而作爲一個開始,一定要在你的isPrime測試方法提前退出:如果您在循環過程達到一個地步,你的計數器高於2,可以退出。然後,你不需要測試i = 0。

1

額外的a++是在while循環中完成的,當時prime == 10001

while (primes < 10001) { 
     if (isPrime(a)) { 
      primes++; 
     } 
     a++; 
} 

您可以使用--a打印您想要的素數。

System.out.println("The 10001st prime number is " + (--a));