Переключатель простых чисел в Java-программе имеет неожиданный вывод

1

Я пытаюсь создать программу, которая читает список из 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 - это странный выход; Любая помощь будет оценена

  • 4
    Какой "странный вывод" вы получаете?
  • 5
    Определить «странный вывод»
Показать ещё 2 комментария
Теги:
for-loop
switch-statement

3 ответа

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;
}

Вы можете вызвать эту функцию для каждого номера, который вы хотите проверить.

Ваш case2 будет выглядеть так:

 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() который будет выполняться для каждой итерации цикла for. Итак, если данный элемент в вашем массиве array равен 5, ваш код будет распечатывать, будет ли ваш номер делиться на каждое число от 2 до 5. Это, вероятно, не то, что вы хотите.

Чтобы исправить это, есть несколько вариантов: во-первых, вы можете иметь флаг boolean, который вы устанавливаете, когда обнаруживаете, что число не является простым, а затем проверьте это и распечатайте результаты после внутреннего цикла for:

case 2:
    for(int j=0;j<10;j++){
        boolean isPrime = true; // assume it 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 также инвертированы.
  • 0
    @ chiastic-security Исправлено; благодарю вас!
Показать ещё 2 комментария
0

Для упражнений по программированию ответы на них будут очень хорошими. Если это было реальное приложение, использующее очень большие числа, алгоритм, который проверяет каждый возможный делитель (или даже незначительные улучшения в этом), будет очень медленным.

Несмотря на то, что можно проверить достоверность с большей уверенностью, чем это, на практике очень и очень эффективно проверять, что (очень) большое количество почти наверняка является простым. Это то, что используется в криптографических приложениях.

Для получения дополнительной информации вы можете посмотреть Миллер-Рабин.

Если вы хотите реализовать, вы можете использовать готовые, а затем преобразовать свой номер в BigInteger а затем использовать BigInteger.isProbablePrime(int certainty) чтобы определить, может ли он быть простым. Вы можете сделать "вероятно" очень близким к определенности, и это все равно будет чрезвычайно эффективным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню