对于这个分配,我需要接受严格的输入,直到输入0才会终止代码。在输入每个数字之后,它需要输出该数字是否为素数。然后在输入零之后,代码应该停止并给出一些输入数字的描述,例如max,min,sum等。
我的问题是,无论我输入什么号码,都说每个号码都是素数,我似乎无法理解为什么。任何帮助将不胜感激!
import java.util.Scanner;
public class Assignment4
{
public static void main (String[] args)
{
int input;
int max = 0;
int min = 100000000;
double sum = 0;
int count= 0;
double average = 0;
Scanner scan = new Scanner(System.in);
boolean isPrime;
do
{
System.out.println("Enter a postive integer. Enter 0 to quit");
input = scan.nextInt();
for (int i =2; i<= input/2; i++) //Determine if prime
{
if (input % i == 0)
isPrime = false;
else
isPrime = true;
if (isPrime = true)
System.out.println("The number " + input + " is a prime number");
else
System.out.println("The number " + input + " is not a prime number");
if (input > max)
{
max = input;
}
if (input < min)
{
min = input;
}
sum += input;
count = count + 1;
average = sum/count;
break;
}
}
while (input != 0);
System.out.println("The Max is " + max);
System.out.println("The Min is " + min);
System.out.println("The sum is " + sum);
System.out.println("The total numbers are " + count);
System.out.println("The average is " + average);
}
}
答案 0 :(得分:3)
如果isPrime
不是除数,则您将i
设置为true。如果您检查的最后i
不是除数,isPrime
将为假,即使上一次迭代中可能存在除数。
解决方案:在开始isPrime
循环之前,将赋值移除为false并将for
设置为true:
import java.util.Scanner;
public class Assignment4 {
public static void main (String[] args) {
int input;
int max = 0;
int min = 100000000;
double sum = 0;
int count= 0;
double average = 0;
Scanner scan = new Scanner(System.in);
boolean isPrime;
do
{
System.out.println("Enter a postive integer. Enter 0 to quit");
input = scan.nextInt();
isPrime = true; // I added this line
for (int i =2; i<= input/2; i++) //Determine if prime
{
if (input % i == 0) {
isPrime = false;
break;
}
//else
// isPrime = true;
}
if (isPrime)
System.out.println("The number " + input + " is a prime number");
else
System.out.println("The number " + input + " is not a prime number");
if (input > max)
{
max = input;
}
if (input < min)
{
min = input;
}
sum += input;
count = count + 1;
average = sum/count;
}
while (input != 0);
System.out.println("The Max is " + max);
System.out.println("The Min is " + min);
System.out.println("The sum is " + sum);
System.out.println("The total numbers are " + count);
System.out.println("The average is " + average);
}
}
代码未经测试,我目前在手机上
有趣的事实:
你只需要循环到Math.sqrt(input)
(平方根)。为了说明这一点:如果input/2
是除数,2
也是除数;)
答案 1 :(得分:2)
我可以看到一些问题:
1)改变:
if (input % i == 0)
isPrime = false;
else
isPrime = true;
要:
if (input % i == 0)
isPrime = false;
并插入
isPrime=true;
在for循环之前。
(因为i的当前值不是除数不会使它成为素数)。
2)改变:
if (isPrime = true)
要:
if (isPrime==true)
或者:
if (isPrime)
3)删除休息;
4)在 all 之后检查除数是否为真,检查isPrime是否为真,而不是在其中。
5)检查i的值,包括输入的平方根,而不是它的一半。它更快。
答案 2 :(得分:1)
David Sherret是对的,你在if语句中有错误。它需要更改为if( isPrime )
。
此外,您正在打印每个input % i
测试的结果。该输出应该在for循环之后发生。
现在,当测试15时,您的代码将打印出来: 数字15是素数 数字15不是素数 数字15是素数 数字15不是素数 数字15是素数 数字15是素数
这是因为:
(15 % 2) equals 1
(15 % 3) equals 0
(15 % 4) equals 3
(15 % 5) equals 0
(15 % 6) equals 3
(15 % 7) equals 1
并且您正在打印每个测试的结果。
在for
循环之前,使用isPrime
初始化true
,如果数字不是素数,则仅在循环内将其设置为false
。然后,在循环之后测试isPrime
并打印语句。像这样:
isPrime = true;
for (int i =2; i<= input/2; i++) //Determine if prime
{
if (input % i == 0)
isPrime = false;
if (input > max)
{
max = input;
}
if (input < min)
{
min = input;
}
sum += input;
count = count + 1;
average = sum/count;
break;
}
if (isPrime)
System.out.println("The number " + input + " is a prime number");
else
System.out.println("The number " + input + " is not a prime number");