2017-03-05 25 views
0

我有一個使用ArrayList和toArray從數字列表中查找質數的方法。大部分的代碼工作,除了當我打印參數1和10時,它打印1,2,3,5,7。因此它打印1到10之間的素數,但它也打印出1.我認爲錯誤出現在第一個或第二個for循環中,但我不確定。使用toArray查找arraylist的素數,打印錯誤

public int primtall(int a, int b) { 
    ArrayList<Integer> primtallene = new ArrayList<>(); 
    int primtall = 0; 
    int største; 
    int minste; 
    if(a == b){ 
     primtall = 0; 
    } 
    else { 
     if(a > b) { 
      største = a; 
      minste = b; 
     } 
     else if (a < b){ 
      minste = a; 
      største = b; 


     for(int i = minste; i <= største; i++) { 
      boolean isPrime = true; 
      for (int j = 2; j < i; j++) { 
       if (i % j == 0) { 
        isPrime = false; 
        break; 
       } 
      } 
      if (isPrime) { 

       primtall = i; 
       primtallene.add(primtall); 
      } 
     } 
    } 

    } 

    Integer[] numrene = new Integer[primtallene.size()]; 
    numrene = primtallene.toArray(numrene); 
    for(Integer nummer : numrene){ 
     System.out.println("Primtall = " + nummer); 
    } 
    return 0; 
} 

不介意最後的返回值,我只是補充說因爲BlueJ需要我。

任何人都可以幫助識別代碼中的錯誤?

在此先感謝!

+0

我不知道我是否不同意以下任何答案,但數字1既不是素數也不是複合數。它應該受到你的首要考驗。 –

回答

0

這是監守以下for循環:

for (int j = 2; j < i; j++) { 
    if (i % j == 0) { 
     isPrime = false; 
     break; 
    } 
} 

這是第一次,i將是1,這將使j < i條件返回false,因此,控制不會進入循環。

因此,isPrime將成立,1將被添加到列表中。爲了防止這種情況發生,您可以在後續的if條件下檢查是否i >= 2,例如

if (isPrime && i >= 2) { 
    primtall = i; 
    primtallene.add(primtall); 
} 

另外,如果你不想return此方法的任何值,你可以改變返回類型爲void,並刪除return聲明。

+0

非常感謝!現在它工作了! –

0
for (int j = 2; j < i; j++) { 
      if (i % j == 0) { 
       isPrime = false; 
       break; 
      } 
     } 

如果i=1,(這將是當minste = 1的情況)上面的循環將永遠不會被輸入並isPrime = false;將永遠不會被執行。因此,對於i = 1被選爲素數。

0

如果從1開始,minste將爲1,且代碼永遠不會輸入第二個for循環,並且isPrime結果爲true

如果您已經知道1不應該被打印,您不需要檢查它。相反,你可以開始第一for環與2