程序应该确定输入数字是否为素数

时间:2013-07-31 22:37:40

标签: java

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

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

5 个答案:

答案 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)第一次循环开始时,xdivide是什么?

(2)如果你看一下xdivide会发生什么,{em>每个开头的xdivide之间存在简单的关系/ 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;
    }       
 }