【问题标题】:What is wrong with my isPrime method?我的 isPrime 方法有什么问题?
【发布时间】:2014-01-14 21:50:02
【问题描述】:

这是我的isPrime 方法:

private static boolean isPrime(int num) {
    if (num % 2 == 0) return false;
    for (int i = 3; i * i < num; i += 2)
        if (num % i == 0) return false;
    return true;
}

我输入isPrime(9),它返回true。方法有什么问题?

【问题讨论】:

  • 因为i*i = 99 &lt; 9 被评估为false。所以你永远不会进入你的 for 循环,因此你会返回 true

标签: java function methods primes


【解决方案1】:

我的样本:

public boolean isPrime(int x) {
    if (x==1) {
        return true;
    } else {
        for(int i=2;i<=Math.sqrt(x);i++) {
            if (x%i==0) return false;   
        }
    }
    return true;
}

【讨论】:

  • 1 不是质数,调整你的样本。
【解决方案2】:
    package Prime;

import javax.swing.*;
import java.util.Scanner;

public class Prime {
    // main method
    public static void main(String[] args) {

        // declare lower bound and upper bound variables and get their values
        Scanner scanner = new Scanner(System.in);

        System.out.print("Enter a Lower Bound number: ");
        int lowerBound = scanner.nextInt();

        System.out.print("Enter an Upper Bound number: ");
        int upperBound = scanner.nextInt();

        int counter;

        if ((lowerBound <= 0) || (upperBound <= 0)) {
            System.out.println("Bounds must be greater than 0, Invalid Bounds");
            } else if (upperBound < lowerBound) {
            System.out.println("Upper bound cannot be less than lower bound, Invalid Bounds\nProgram terminating.");
        } else {
            // loop from lower bound to upper bound
            System.out.println("The Prime numbers are: ");
            for (counter = lowerBound; counter <= upperBound;
                 counter++) {
                // if prime number, display in primeNumbersJTextArea
                if (isPrime(counter)) {
                    System.out.print(counter + ", ");
                }
            } // end for loop
        } // end else

    } // end method calculatePrimesJButtonActionPerformed


    // method to determine if a number is a Prime number?
    private static boolean isPrime(int number) {
        // number 1 is not a Prime number
        if (number == 1)
            return false;

        int limit = (int) Math.sqrt(number);

        for (int counter = 2; counter <= limit; counter++) {
            if (number % counter == 0) {
                return false;
            }
        }
        return true;
    }
}

【讨论】:

    【解决方案3】:

    你的条件应该是 i * i

    private static boolean isPrime(int num) 
    {
            if (num == 2) 
                return true;
            if (num < 2 || num % 2 == 0) 
                return false;
            for (int i = 3; i * i <= num; i += 2)
                if (num % i == 0) 
                    return false;
            return true;
    }
    

    您没有考虑数字 9,因此 9

    【讨论】:

    • @ADG 感谢您的提示.. 但是当被问到问题时.. 他想修复代码中的特定错误.. 我没有注意到 num=2 时的大小写
    • 1 不是质数,应在函数的第二行添加|| num == 1
    • @StellaLie 更一般地说,小于 2 的数字不是素数。
    【解决方案4】:
    public static boolean isPrime (int number) {
        if(number < 2) {
            return false;
        }
        int check = (int) Math.sqrt(number);
    
    
        for(int i = 2; i <= check; i++) {
            if(number % i == 0) {
                return false;
            }
        }
        return true;
    }
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
    【解决方案5】:

    您可以简单地使用 if 和 else 语句来检查数字是否为素数。有一个模式,一旦你的数字达到一定的限制,所有的数字要么是 2 的倍数,要么是 3 的倍数。

    public static boolean isPrime2 (int n)
    {
        if (n == 1) {
            return false;
        } else if (n == 2 || n==3) {
            return true;
        } else if (n>2) {
            if(n % 2 ==0 || n % 3 == 0) {
                return false;
            }
        }
        return true;
    }
    

    【讨论】:

      【解决方案6】:

      像这样更改您的代码(检查条件):

       private static boolean isPrime(int num) {
              if (num == 2) return true;
              if (num % 2 == 0)
                  return false;
              for (int i = 3; i * i <= num; i += 2)
                  if (num % i == 0) return false;
              return true;
        }  
      

      【讨论】:

        【解决方案7】:

        Java 8:(带有 lambda 表达式和流的示例)

        public static boolean isPrimeFunctionalStyle(int number) {
            return number > 1 && 
                    IntStream.rangeClosed(2, (int) Math.sqrt(number))
                        .noneMatch(i -> number % i == 0);
        }
        

        【讨论】:

          【解决方案8】:

          (后期)侧节点:

          private static boolean isPrime(int num) {
              if (num % 2 == 0) return false;
              for (int i = 3; i * i < num; i += 2)
                  if (num % i == 0) return false;
              return true;
          }
          

          缺少此代码22 是一个素数。所有可被2 整除的东西都不是,除了2 - 所以,使用:

          private static boolean isPrime(int num) {
              if (num == 2) return true;
              if (num % 2 == 0) return false;
              for (int i = 3; i * i < num; i += 2)
                  if (num % i == 0) return false;
              return true;
          }
          

          【讨论】:

          • 我会反对将代码与 OP 的错误完全相同,但我不能。应该有i * i &lt;= num
          【解决方案9】:
           for (int i = 3; i * i < num; i += 2)
                  if (num % i == 0) return false;
          

          i * i 为 9,且 9 中不小于 9,因此 for 循环不会运行。

          【讨论】:

            【解决方案10】:

            循环不运行。它在 i 的第一个值处终止,因为 3 x 3 = 9 它不满足条件 i * i

            【讨论】:

              【解决方案11】:

              循环永远不会执行,所以它直接返回true

              【讨论】:

                【解决方案12】:

                i * i &lt; num 的循环条件应该是i * i &lt;= num

                【讨论】:

                  【解决方案13】:

                  这里有一些提示:

                  1. 主要的错误是由于循环中的非一错误,您永远不会检查 sqrt(num) 的整除性。

                  2. 另一个错误是你不认为2 是素数(它是)。

                  【讨论】:

                    猜你喜欢
                    • 2022-11-23
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-03-29
                    • 1970-01-01
                    相关资源
                    最近更新 更多