Я пытаюсь создать программу, которая читает список из 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 - это странный выход; Любая помощь будет оценена
Это функция, чтобы проверить, является ли число простым или нет:
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:
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;
isPrime
требуется значение по умолчанию true
, а затем устанавливается значение false
если найден делитель. Операторы println
также инвертированы.
Для упражнений по программированию ответы на них будут очень хорошими. Если это было реальное приложение, использующее очень большие числа, алгоритм, который проверяет каждый возможный делитель (или даже незначительные улучшения в этом), будет очень медленным.
Несмотря на то, что можно проверить достоверность с большей уверенностью, чем это, на практике очень и очень эффективно проверять, что (очень) большое количество почти наверняка является простым. Это то, что используется в криптографических приложениях.
Для получения дополнительной информации вы можете посмотреть Миллер-Рабин.
Если вы хотите реализовать, вы можете использовать готовые, а затем преобразовать свой номер в BigInteger
а затем использовать BigInteger.isProbablePrime(int certainty)
чтобы определить, может ли он быть простым. Вы можете сделать "вероятно" очень близким к определенности, и это все равно будет чрезвычайно эффективным.