代码之家  ›  专栏  ›  技术社区  ›  Jack M

在数组中查找素数时出现逻辑错误

  •  0
  • Jack M  · 技术社区  · 2 年前

    当我试图在Codecademy上查找此数组中的所有素数时,收到一个逻辑错误:

    import java.util.Arrays;
    import java.util.ArrayList;
    
    class PrimeDirective {
      
      // Add your methods here:
    public void findPrime(int[] nums) {
      ArrayList<Integer> primeNumbers = new ArrayList<Integer>();
        for (int i = 0; i < nums.length; i++) {
          if ((nums[i] % 2 != 0 || nums[i] % 3 != 0 ) || nums[i] % 5 != 0) {
            primeNumbers.add(nums[i]);
            } else { continue; }}
                System.out.println(primeNumbers); }
      
    public static void main(String[] args) {
      PrimeDirective pd = new PrimeDirective();
      int[] numbers = {6, 29, 28, 33, 11, 100, 101, 43, 89};
      pd.findPrime(numbers);
      }  
    }
    

    我预计,如果这个数字不能被2、3或5整除,那么它就是素数。相反,该方法将所有数组项添加到我在该方法中初始化的新ArrayList中。

    我想这是我数学上的一个问题,但这一切在我的脑海中都很有道理。

    1 回复  |  直到 2 年前
        1
  •  1
  •   Abra BlueJK    2 年前

    代码中出现的逻辑错误是因为检查素数的条件不正确。你只是在检查这个数字是否不能被2、3或5整除,但这不足以确定一个数字是否为素数。例如,数字49不能被2、3或5整除,但它也不是素数,因为它可以被7整除。素数是一个只能被自身和1整除的数。所以,你需要检查这个数字是否可以被从2到其平方根的任何其他数字整除。如果是,那么它就不是素数。如果不是,那么它就是一个素数。

    修复代码的一种方法是使用布尔变量来跟踪数字是否为素数,并使用 for 循环检查从2到数字平方根的所有可能除数。如果其中任何一个将数字除为无余数,则将布尔变量设置为false并中断循环。如果它们都没有,则将布尔变量设置为true,并将数字添加到 primeNumbers 列表以下是如何做到这一点的示例:

    import java.util.Arrays;
    import java.util.ArrayList;
    
    class PrimeDirective {
        
        // Add your methods here:
        public void findPrime(int[] nums) {
            ArrayList<Integer> primeNumbers = new ArrayList<Integer>();
            for (int num : nums) {
                boolean isPrime = true; // assume the number is prime
                if (num == 2) { // special case for 2
                    isPrime = true;
                }
                else if (num > 2) { // check numbers greater than 2
                    for (int i = 2; i <= Math.sqrt(num); i++) { // loop from 2 to square root of num
                        if (num % i == 0) { // if num is divisible by i
                            isPrime = false; // set isPrime to false
                            break; // break out of the loop
                        }
                    }
                }
                else { // handle numbers less than or equal to 1
                    isPrime = false; // set isPrime to false
                }
                if (isPrime) { // if isPrime is true
                    primeNumbers.add(num); // add num to the list
                }
            }
            System.out.println(primeNumbers); // print the list
        }
    
        public static void main(String[] args) {
            PrimeDirective pd = new PrimeDirective();
            int[] numbers = {6, 29, 28, 33, 11, 100, 101, 43, 89};
            pd.findPrime(numbers);
        }
    }