Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一种素数程序,允许用户测试数字,直到用户输入零为止。但是,在测试6个数字后,它会打印错误的消息_Java_Primes - Fatal编程技术网

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

Java 一种素数程序,允许用户测试数字,直到用户输入零为止。但是,在测试6个数字后,它会打印错误的消息,java,primes,Java,Primes,一种素数程序,允许用户在输入零之前测试一个数是否为素数。但是,在测试了大约6个数字之后,它会打印错误的消息,就像它打印的数字是非素数的素数一样,并且打印的数字不是素数的素数一样 package com.selfexercise.exercise; /** * Created by One on 2/15/2017. */ import java.util.Scanner; public class PrimeNumbers { public static void main(String[]

一种素数程序,允许用户在输入零之前测试一个数是否为素数。但是,在测试了大约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;
    }
}
}
package com.selfexercise.exercise;
/**
*由One于2017年2月15日创建。
*/ 
导入java.util.Scanner;
公共类素数{
公共静态void main(字符串[]args){
int n;
布尔标志=真;
扫描仪输入=新扫描仪(系统输入);
对于(;;){
System.out.print(“\n请输入一个数字:”);
n=in.nextInt();

对于(int i=2;i您在程序开始时声明
flag=true
。然后,一旦找到一个因子,它就会被设置为
false
,这样您就知道该数字不是素数

但是,当用户输入另一个数字时,
标志
已为false。每次从用户处获得新数字时,您需要将其设置为
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();
    ...

希望这会有所帮助?一旦变量标志变为false,您的代码就不允许任何指令将其重置为默认状态,以便在for(;;)循环的下一次迭代中使用。其他人已经指出了您的错误。我对您的代码有一些其他评论

首先,您的基本检查系统工作正常,但效率低下。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()

这使用了
isPrime()
方法,该方法替换您的
标志
变量。请注意,使用
do…while
循环可从循环中消除显式的
中断
。这是因为该循环样式比您先前使用的
for
循环更适合您正在执行的操作。
for
循环t如果您事先知道要测试多少个数字。

您需要在
for(;;)
循环内部(以及内部
for
循环之前)设置
flag=true
,因此,对于输入的每个新数字,标志都将以真开始。哦,我自己解决了这个问题,感谢大家的支持。问题是我将标志=真放在永久循环之外。我必须在永久循环的第一个花括号之后将标志=真放在永久循环之内。是的,我想我正在很好地校对我自己的同事无论如何,谢谢你的快速回复。谢谢亲爱的!非常感谢亲爱的,我会根据你的建议修改代码。
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()
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);

}