繁体   English   中英

一个素数程序,允许用户测试数字,直到用户输入零。 但是,在测试6个数字后,它会打印错误的消息

[英]a prime number program that allows the user to test numbers till the user enters zero. However, after testing 6 numbers, it prints incorrect message

一个素数程序,允许用户在用户输入零之前测试数字是否为素数。 然而,在测试了大约6个数字之后,它打印出不正确的消息,就像它打印数字也是非素数的素数而且打印数字不是素数的素数。

package com.selfexercise.exercise;

/**
* Created by One on 2/15/2017.
*/ 
import java.util.Scanner;
public class PrimeNumbers {
public static void main(String[] args) {
    int n;
    boolean flag=true;

    Scanner in = new Scanner(System.in);
    for(;;) {
        System.out.print("\nPlease enter a number : ");
        n = in.nextInt();

        for (int i = 2; i <= n / 2; i++) {
            if (n % i == 0) {
                flag = false;
                break;
            }
        }
        if (flag) {
            System.out.println(n + " is a prime number");
        } else {
            System.out.println(n + " is not a prime number");
        }
        if(n==0)
            break;
    }
}
}

你在程序的开头声明了flag = true 然后,只要找到一个因子,就会将其设置为false ,因此您知道该数字不是素数。

但是,当用户输入另一个数字时, flag 已经为假 每次从用户处获取新号码时,都需要将其设置为true

// no need to declare flag before the loop

for(;;) {
    // initialise flag to true for each input number
    boolean flag = true;
    System.out.print("\nPlease enter a number : ");
    n = in.nextInt();
    ...

其他人指出了你的错误。 我还有一些关于你的代码的评论。

首先,您的主要检查系统有效,但效率低下。 Eratosthenes的筛子比试用师快得多,这是你正在使用的方法。 即使只是通过试验分割,您可以通过使用sqrt(n)的限制代替n / 2并分别处理偶数来更快地编写代码。 通过将主要检查放入单独的布尔方法来保持主代码更清晰也是传统的:

boolean isPrime(int num) {

  // Low and negative numbers.
  if (num < 2) {
    return false;
  }

  // Even numbers.
  if (num % 2 == 0) {
    // Two is the only even prime.
    return num == 2;
  }

  // Odd numbers.
  for (int i = 3; i * i <= num; i += 2) {
    if (num % i == 0) {
      return false;
    }
  }

  return true;

}  // end isPrime()

无论何时需要检查素数,都可以重复使用该方法。

其次,你在主代码中处理循环看起来很笨拙,比如使用break来退出。 鉴于您反复阅读用户的输入,直到输入0为止,那么do ... while循环最适合:

public static void main(String[] args) {

    int n;
    Scanner in = new Scanner(System.in);

    do {
        System.out.print("\nPlease enter a number or 0 to quit : ");
        n = in.nextInt();

        if (isPrime(n)) {
            System.out.println(n + " is a prime number.");
        } else {
            System.out.println(n + " is not a prime number.");
        }
    } while (n != 0);

}

这使用了之前的isPrime()方法,它取代了你的flag变量。 请注意,使用do ... while循环可以消除循环中的显式break 那是因为这种循环风格比你之前使用的for循环更适合你正在做的事情。 如果你事先知道要测试多少个数字, for循环会更好。

if (flag) {
        System.out.println(n + " is a prime number");
    } else {
        System.out.println(n + " is not a prime number");
    }
flag = true;

希望这会有所帮助吗? 一旦变量标志变为false,您的代码就不允许指令将其重置回默认状态,以便(;;)循环内的下一次迭代

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM