我正在尝试创建一个程序,该程序读取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是奇怪输出发生的地方;任何帮助将不胜感激
答案 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;