java程序中的素数开关具有意外输出

时间:2014-09-26 21:41:20

标签: java for-loop switch-statement

我正在尝试创建一个程序,该程序读取10个整数的列表,并询问用户是否想知道输入的整数是偶数/奇数,素数还是符号。 我不知道错误在哪里:

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是奇怪输出发生的地方;任何帮助将不胜感激

3 个答案:

答案 0 :(得分: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()语句,它将在for循环的每次迭代中执行。因此,如果数组中的给定元素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;

答案 1 :(得分:0)

对于编程练习,给出的答案会很好。如果这是一个真正的应用程序,使用非常大的数字,检查每个可能的除数(或甚至对此的轻微改进)的算法将非常慢。

尽管可以比这确定更有效地测试素性,但在实践中检查(非常)大数字几乎是非常有效的 当然素数。这是加密应用程序中使用的内容。

有关详细信息,您可以查看Miller-Rabin

如果您想要实施,可以使用现成的,然后将您的号码转换为BigInteger,然后使用BigInteger.isProbablePrime(int certainty)来确定它是否可能是素数。你可以制作&#34;可能&#34;非常接近确定性,它仍然非常有效。

答案 2 :(得分: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;