//我应该用循环和决策语句来做,但它不起作用。救命啊!
import java.util.Scanner;
public class main {
/**
* @param args
*/
public static void main(String[] args) {
//Declare variables
Scanner abc;
abc = new Scanner (System.in);
int input;
int divide = 2;
int count=0;
//Ask for input
System.out.println("Please enter an integer to determine if it is prime");
input = abc.nextInt();
//Do math
for (int x=1; x < input; x++) {
if ((input%divide) == 0)
count += 1;
divide = divide + 1;
}
if (count == 0)
System.out.println("It is a prime number");
else
System.out.println("It is not a prime number");
}
}
答案 0 :(得分:2)
在你的for循环中,对于最后一次迭代,x = input - 1
,但这意味着divide = input
(因为divide
在开头是一个更大的,并且每次迭代时都增加一次如果数字是素数而不是1
,那么count实际上将等于0
。
答案 1 :(得分:1)
for (int x=2; x < input; x++)
(将x=1
更改为x=2
)
否则你最终会试图将5除以5以测试5是否为素数
答案 2 :(得分:1)
你在计算除数的数量;你需要做的就是确定是否至少有一个除数。这是一个更好的算法:
function isPrime(n)
if n is even
return n == 2
d := 3
while d * d <= n
if n % d == 0
return False
d := d + 2
return True
我在博客上的文章Programming with Prime Numbers中讨论了这个算法,其中包括用Java实现的文章。
答案 3 :(得分:1)
看起来count
应该计算input
不计算1和input
的因子数。为了便于阅读,我建议使用像numOfFactors这样的名称而不是count
。
鉴于此,现在看看你的循环并回答这些问题。我不打算给你答案。 (是的,您可以通过查看其他人的评论来获得答案,但我认为无论如何您都会通过回答这些问题来了解更多信息。)
(1)第一次循环开始时,x
和divide
是什么?
(2)如果你看一下x
和divide
会发生什么,{em>每个开头的x
和divide
之间存在简单的关系/ em>循环时间。它是什么?
(3)你经历循环的最后时间x
是什么时候?
(4)基于#2和#3的答案,在最后一次循环开始时divide
是什么?什么输入%除以等于?
这就是它无法正常工作的原因。先说出来。然后我们可以讨论如何使其更有效地工作。
更多:好的,我会再说一件事。如果您关心的是count
是否为零,您可以在找到因素后立即退出循环。像这样:
if ((input%divide) == 0)
{
count += 1;
break;
}
(如果你这样做,那么你应该使用count
而不是boolean foundAFactor
,因为它只是说你是否找到了一个因素,而不是有多少因素。)
但如果你真的想知道确切数量的因素,那就不要那样做了。
答案 4 :(得分:1)
你好这样做:
for(int i = input-1; i > 0; i--) {
if((input % i) == 0) {
if(i == 1)
System.out.println("is a prime");
else
System.out.println("is not a prime");
break;
}
}