Java 为什么这个主检查器可以工作,而如果我试图使它更高效,它就不能工作
下面是我(在互联网的帮助下)用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
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*ii
在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;