-6

//我应该用循环和决策语句来做,但它不起作用。帮助!

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");
    }
}
4

5 回答 5

2

在你的 for 循环中,对于最后一次迭代,x = input - 1,但这意味着divide = input(因为divide一开始更大,并且每次循环迭代都增加一次),所以如果数字是素数,count 实际上将等于1,而不是0

于 2013-07-31T23:03:23.420 回答
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;
    }       
 }
于 2013-07-31T23:16:15.780 回答
1

for (int x=2; x < input; x++) (更改x=1x=2

否则你最终会尝试将 5 除以 5 以测试 5 是否为素数

于 2013-07-31T22:52:22.607 回答
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

我在博客上的用质数编程一文中讨论了这个算法,其中包括 Java 中的实现。

于 2013-07-31T22:53:37.850 回答
1

看起来count应该计算input不计算 1 和的因子的数量input。为了便于阅读,我建议使用 numOfFactors 之类的名称,而不是count.

鉴于此,现在看看你的循环并回答这些问题。我不会给你答案的。(是的,您可以通过查看其他人的评论来获得答案,但我认为您无论如何都会通过回答这些问题来了解更多。)

(1) 什么是你第一次通过循环,在循环的开始xdivide

(2) 如果你看一下 and 发生了什么,在循环的每次开始时xdivide之间都有一个简单的关系。它是什么?xdivide

(3) 你最后一次通过循环x是什么时候?

(4) 根据#2 和#3 的答案,divide最后一次循环的开始是什么?input%divide 等于什么?

这就是为什么它不起作用。先弄清楚这一点。然后我们可以讨论如何使它更有效地工作。

更多:好的,我再说一件事。如果您只关心是否count为零,那么您可以在找到一个因素后立即退出循环。像这样:

if ((input%divide) == 0)
{
    count += 1;
    break;
}

(如果你这样做,那么count你应该使用 a而不是,boolean foundAFactor因为它说的是你是否找到了一个因素,而不是有多少。)

但是,如果您真的想知道因子的确切数量,请不要这样做。

于 2013-07-31T22:54:36.047 回答