gpt4 book ai didi

java - 为什么这个主要检查器可以工作,如果我试图让它更有效率就不起作用

转载 作者:行者123 更新时间:2023-12-04 04:44:32 26 4
gpt4 key购买 nike

下面是我用 Java 制作的第一个程序(在 Internet 的帮助下)。它是一个检查给定整数是否为素数并提示用户反馈的程序。如果用户输入不是整数,则输出它不是整数。后者也会在输入大整数时发生。这是代码:

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

}
}

这个程序完成了他的工作,但我不知道为什么带有 if 语句的部分有效。 "i == number"怎么可能给出真值 (当您输入素数时,它会打印出“YES!PRIME”)?局部变量 i 在 for 循环中递增,但 if 语句在 for 循环之外。

/编辑 下面的段落是废话,因为 Jim Lewis points out
现在想想,我能想到的唯一原因是 == 运算符检查 i-'object' 和 number-'object' 是否属于相同的 'type'(即,有一个引用到同一个对象)。由于它们都属于原始整数类型,因此该程序捕获整数(其他输入抛出 NumberFormatException 被捕获并输出“不是整数”)。质数通过第一个 for 循环,然后神奇的 if 语句给出“true”并打印出“YES!PRIME!”。

我在正确的轨道上吗?

我通过删除神奇的 if 语句并将其更改为 if-else 语句来改进该程序,如下所示:( /edit 修复了代码问题,感谢 answer of ajb )
boolean factorFound = false;            
for (i = 2; i < Math.sqrt(number) + 1; i++) {
int n = number % i;
if (n == 0) {
factorFound = false;
break;
}
else {
factorFound = true;
}
}
if(factorFound == false) System.out.println("NOT a prime!");
if(factorFound == true) System.out.println("YES! PRIME!");

通过只达到输入数字的平方根,计算时间会得到改善(我知道只检查奇数或使用 AKS Primality Test 可以进一步改善,但这不是重点)。

我的主要问题是为什么我不能以同样的方式提高第一个程序(使用神奇的 if 语句)的效率。当我在第一个程序中像这样增强 for 循环“(i = 2; i < Math.sqrt(number) + 1; i++)”时,它不再打印出“YES!PRIME!”当您输入素数时。它给出了一个空白。即使我之前的解释是正确的——它可能不是——这也没有解释。

你可以启发我。

答案: int i is outside of scope of for-loop and after going through the for-loop multiple times upto number the value of i will reach the value number, when we can be sure it is a prime .此外,在检查消失后的“YES!PRIME!”语句再次证明实际上可以将 if 语句和 for 循环中的 number 更改为 ( Math.sqrt(number) + 1 ) 并具有工作代码。所以这个问题是基于一个错误的前提。

最佳答案

// I do not understand why the if-statement below works



说明:因为 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;

关于java - 为什么这个主要检查器可以工作,如果我试图让它更有效率就不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18391768/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com