为什么我的代码显示输入的数字是质数,即使它不是?

Why is my code showing that the entered number is prime even when it's not?

提问人:Varun Tripathti 提问时间:11/9/2023 最后编辑:TimmyVarun Tripathti 更新时间:11/9/2023 访问量:114

问:

我使用了一种检查输入的数字是否为质数的方法。但是,它显示输入的数字每次都是质数。我的逻辑有什么错误?

import java.util.Scanner;

public class ptest2 {

   static long isprime(long n){
       if ( n == 0 || n == 1 ){
           System.out.println(" Number is not prime ");
       }

       else{

       for(int i = 2; i < n; i++){
           if( n % i == 0 ) {
               System.out.println("Number is not prime ");
              }
           else  {
               System.out.println("Number is prime ");
               break;
             }
           }
       }
       return 0;
   }

    public static void main(String[] args) {
        System.out.println("Enter a number to check if it is prime ");
        Scanner sc = new Scanner(System.in);
          long a = sc.nextLong();
        System.out.println(isprime(a));
    }
}
java.util.scanner

评论

9赞 David 11/9/2023
这是您开始熟悉调试器使用的好机会。在调试器中单步执行代码时,哪个操作首先会产生意外结果?该操作中使用的值是什么?结果如何?预期的结果是什么?为什么?要了解有关此社区的更多信息以及我们如何为您提供帮助,请从导览开始并阅读如何提问及其链接资源。
7赞 PM 77-1 11/9/2023
虽然“非素数”可以用单个除数来证明,但“素数”只有在检查了所有适用的除数后才能确定。
0赞 Old Dog Programmer 11/9/2023
题外话:名称为 的方法通常返回 .isFooboolean

答:

1赞 Chris 11/9/2023 #1

你把它弄倒了。当你找到一个偶数除数时,你的循环就会短路。就目前而言,当您找到非偶数除数时,您会短路。

您只有一个始终保持不变的回报。

有人会认为你也希望你的方法返回。boolean

您正在寻找以下逻辑:

public class ptest2 {
   static boolean isprime(long n) {
       if (n == 0 || n == 1) return false;

       for (int i = 2; i < n; i++) {
           if (n % i == 0) {
               return false;
           }
       }

       return true;
    }
}

虽然你也只需要迭代到 的平方根。n

评论

0赞 user85421 11/9/2023
并且,在测试 2 之后,不必测试其他偶数。(顺便说一句,不被认为是主要的)01
0赞 queeg 11/9/2023 #2

函数 isprime() 将始终返回 0。这有意义吗?好吧,您仍然有控制台输出。

但是看看你的循环:

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

仅仅因为一旦一个部门失败了,这个数字就不是素数。所有这些部门都必须失败。因此,第一次打破是错误的。

幸运的是,您不会在 n 之前运行循环,但只要 i 小于 n。否则,你会除以总是没有余数的 n/n,从而得出该数是素数的结论。

0赞 AztecCodes 11/9/2023 #3

这就是问题所在。isPrime() Method

解决方法:

  • 损坏的方法已修复isPrime()
  • 调整了 OOP 规则
  • 代码重构

好代码:

import java.util.Scanner;

public class ptest2 {

    static boolean isPrime(long n) {

        // Checks out exceptional cases
        if (n == 0 || n == 1) {
            System.out.println("Number is not prime");
            return false;
        }

        // Optimized for-loop
        for (int i = 2; i <= Math.sqrt(n); i++) {
            if (n % i == 0) {
                System.out.println("Number is not prime");
                return false;
            }
        }
        System.out.println("Number is prime");

        return true;
    }

    // Main Method calls 
    public static void main(String[] args) {
        System.out.println("Enter a number to check if it is prime ");
        Scanner sc = new Scanner(System.in);
        long a = sc.nextLong();
        isPrime(a);
    }
}