2014-09-26 30 views
1

我想創建一個程序,讀取10個整數的列表,並詢問用戶他們是否想知道輸入的整數是偶/奇,素數,或他們的標誌。 我沒有看到那裏的錯誤是:素數切換在一個Java程序有意想不到的輸出

import java.io.*; 
public class Menu1 { 
public static void main(String args[])throws IOException{ 
    BufferedReader b=new BufferedReader(new InputStreamReader(System.in)); 
    int array[]=new int[10]; 
    int a=0, i=0; 
    System.out.println("Welcome, please enter 10 integers:"); 
    try{ 
     for(i=0;i<10;i++){ 
      System.out.println("Enter integer "+(i+1)+":"); 
      array[i]=Integer.parseInt(b.readLine()); 
     } 
    }catch(NumberFormatException e){ 
     System.err.println("Not an integer! "+e.getMessage()); 
    }   
    System.out.println("What would you like to know?\n(1) Even/Odd\n(2) Primes\n(3) Sign"); 
    try{ 
     a=Integer.parseInt(b.readLine()); 
    }catch(NumberFormatException e){ 
     System.err.println("Not an integer! "+e.getMessage()); 
    }  
    switch (a){ 
    case 1: 
     for(i=0;i<10;i++){ 
      if(array[i]%2==0) 
       System.out.println(array[i]+" is even"); 
      else 
       System.out.println(array[i]+" is odd"); 
     } 
     break; 
    case 2: 
     for(int j=0;j<10;j++){ 
      for(i=2;i<array[j];i++){ 
       if(array[j]%i==0) 
        System.out.println(array[j]+" isn't prime"); 
       else 
        System.out.println(array[j]+" is prime"); 
      } 
     } 
     break; 
    case 3: 
     for(i=0;i<10;i++){ 
      if(array[i]>0) 
       System.out.println(array[i]+" is positive"); 
      else if(array[i]<0) 
       System.out.println(array[i]+" is negative"); 
      else 
       System.out.println(array[i]+" has no sign"); 
     } 
     break; 
    default: 
     System.out.println("Invalid Option"); 
    } 
} 

}

情況下1和3的情況下工作得很好,情況2是這裏的怪輸出發生;任何幫助將不勝感激

+4

什麼樣的「怪輸出」的你好嗎? – APerson 2014-09-26 21:43:03

+5

定義「奇怪的輸出」 – Swayam 2014-09-26 21:43:42

+1

您需要在打印之前確定數字是否爲素數。現在您檢查的每個數字都會打印N-2次,其中N是數組中的值。確定「不是素數」時,調整第二個for循環停止,然後僅打印一次。 – Ross 2014-09-26 21:47:04

回答

0

這是一個函數來檢查,如果一個數是素數或不:

public static boolean isPrimeNumber(int number) { 
    if (number == 2 || number == 3) { 
     return true; 
    } 
    if (number % 2 == 0) { 
     return false; 
    } 
    int sqrt = (int) Math.sqrt(number) + 1; 
    for (int i = 3; i < sqrt; i += 2) { 
     if (number % i == 0) { 
      return false; 
     } 
    } 
    return true; 
} 

您可以調用該函數要檢查每一個數字。

你的情況2會是這樣:

case 2: 
    for(int j=0;j<10;j++){  
      if(!isPrimeNumber(array[j])) 
       System.out.println(array[j]+" isn't prime"); 
      else 
       System.out.println(array[j]+" is prime"); 
    } 
    break; 
2

在你的代碼的情況下2:

case 2: 
    for(int j=0;j<10;j++){ 
     for(i=2;i<array[j];i++){ 
      if(array[j]%i==0) 
       System.out.println(array[j]+" isn't prime"); 
      else 
       System.out.println(array[j]+" is prime"); 
     } 
    } 
    break; 

你已經把一個System.out.println()語句,將用於循環的每個迭代執行。因此,如果數組中的給定元素array爲5,那麼您的代碼將打印出您的數字是否可以被2到5中的每個數字整除。這可能不是您想要的。

要解決這個問題,有幾個選擇:對於一個,你可以有一個布爾標誌,當你發現該數字不是素數時,你設置了一個布爾標誌,然後檢查並在內循環後打印你的結果:

case 2: 
    for(int j=0;j<10;j++){ 
     boolean isPrime = true; // assume it's prime 
     for(i=2;i<array[j];i++){ 
      if(array[j]%i==0) 
       isPrime = false; 
       break; // get out of the inner for loop early 
     } 
     if(isPrime) 
      System.out.println(array[j]+" is prime"); 
     else 
      System.out.println(array[j]+" isn't prime"); 
    } 
    break; 
+0

在最後的代碼是南轅北轍。它需要'isPrime'默認爲'true',如果找到一個除數則設置爲'false'。 'println'語句也被顛倒過來。 – 2014-09-26 21:49:39

+0

@ chiastic-security固定;謝謝! – APerson 2014-09-26 21:50:05

+0

啊,你已經糾正了第一個問題。儘管如此,'println'語句仍然是錯誤的。 – 2014-09-26 21:50:07

0

對於編程練習,給出的答案可以做得很好。如果這是一個真正的應用程序,使用非常大的數字,檢查每個可能的除數(甚至是稍微改進)的算法將非常緩慢。

雖然它可能遠比這個更有效地測試與確定性素性,在實踐中這是非常,非常有效的檢查(非常)大量是幾乎肯定 黃金。這是在密碼應用程序中使用的。

有關更多詳細信息,請查看Miller-Rabin

如果你想要一個實現你可以使用現成的,然後將您的號碼轉換爲BigInteger,然後使用BigInteger.isProbablePrime(int certainty)來確定它可能是質數。你可以使「可能」非常接近確定性,它仍然是非常有效的。