什么是我的代码错误找到素数?

时间:2016-02-23 17:55:23

标签: java loops

对于这个分配,我需要接受严格的输入,直到输入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);


}   

}

3 个答案:

答案 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");