Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.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 为什么这个主检查器可以工作,而如果我试图使它更高效,它就不能工作_Java_Primes_Math.sqrt - Fatal编程技术网

Java 为什么这个主检查器可以工作,而如果我试图使它更高效,它就不能工作

Java 为什么这个主检查器可以工作,而如果我试图使它更高效,它就不能工作,java,primes,math.sqrt,Java,Primes,Math.sqrt,下面是我(在互联网的帮助下)用Java编写的第一批程序之一。它是一个检查给定整数是否为素数的程序,并向用户提示反馈。如果用户输入不是整数,则输出它不是整数。输入大整数时也会出现后一种情况。代码如下: import java.util.Scanner; class BasicPrime1 { public static void main(String[] args) { try { System.out.println("Enter an In

下面是我(在互联网的帮助下)用Java编写的第一批程序之一。它是一个检查给定整数是否为素数的程序,并向用户提示反馈。如果用户输入不是整数,则输出它不是整数。输入大整数时也会出现后一种情况。代码如下:

import java.util.Scanner;

class BasicPrime1 {
    public static void main(String[] args) {

        try {
            System.out.println("Enter an Integer: ");
            Scanner sc = new Scanner(System.in);

            int i; 
            int number = Integer.parseInt(sc.nextLine());

        // 1 and numbers smaller than 1 are not prime
            for (i = 1; number <= i;) {
                System.out.println("NOT a prime!");
                break;
            }

        // Number is not prime if the remainder of a division (modulus) is 0
            for (i = 2; i < number; i++) {  
                int n = number % i;         
                if (n == 0) {                 
                    System.out.println("NOT a prime!");
                    break;
                }  
            }

        // I do not understand why the if-statement below works.
            if(i == number) { 
                System.out.println("YES! PRIME!");
            }
        }

        catch(NumberFormatException nfe) {
            System.out.println("Not an integer!");
        }

    }
}
import java.util.Scanner;
类基本时间1{
公共静态void main(字符串[]args){
试一试{
System.out.println(“输入一个整数:”);
扫描仪sc=新的扫描仪(System.in);
int i;
int number=Integer.parseInt(sc.nextLine());
//1和小于1的数字不是素数
对于(i=1;数字
//我不明白为什么下面的if语句有效

说明:因为i一直递增,直到它等于number。如果您在sqrt(number)处停止,则If语句将始终失败

顺便说一句,我不喜欢使用整数的平方根。我更喜欢使用isPrime函数:

        if (number < 2) return false;
        if (number > 2 && number % 2 == 0) return false;
        for (int i = 3; i * i <= number; i = i + 2)
            if (number % i == 0) return false;
        return true;
if(number<2)返回false;
如果(编号>2&&number%2==0)返回false;

for(int i=3;i*i
i
for
循环之外声明,因此其值仍在范围内,并且在循环之后可用 完成(与比较数据类型或类似内容无关!)

如果没有找到除数,则
i
循环条件最终将被取消 失败,使用
i==number
(如果循环找到一个除数并点击
break
语句, 这一条件不再适用)

当您进行
sqrt
优化时,循环的结束条件会改变, 因此,循环退出后,
i==number
不再有效,即使该数字是素数

在我看来,明确设置一个标志(例如,
isPrime=0
在跳出循环之前),然后检查该标志,而不是查看
循环变量以查看循环是否完成。

在第二个示例中,您不会让它通过整个循环。如果n为0,则您知道它不是素数,您可以立即退出循环,这是正确的。但是如果n不是0,则必须再次通过循环,但按照您编码它的方式,您正在中断。您需要继续遍历循环,然后当循环完成时,检查是否因为发现它不是素数而离开,或者整个循环是否完成。最好的方法是定义一个布尔值,比如说
factorFound
;将其初始化为false,在中断前将其设置为true,然后在循环完成后对其进行测试。啊,你是对的。如果数字%i是非零,这并不意味着没有另一个更高的i为零,因此第二个示例可能会给出误报。我用布尔值更新了代码,现在它工作正常。感谢您的回答,这确实是一段更干净、更高效的代码。
        if (number < 2) return false;
        if (number > 2 && number % 2 == 0) return false;
        for (int i = 3; i * i <= number; i = i + 2)
            if (number % i == 0) return false;
        return true;