【问题标题】:Error in checking if array members are prime or not检查数组成员是否为素数时出错
【发布时间】:2020-04-16 02:58:10
【问题描述】:

我应该扫描一个整数数组,然后循环遍历它,根据整数是否为素数打印“素数”或“非素数”。 在某些情况下是正确的,而在其他情况下是错误的(例如 33)。这是我的代码:

public class Solution {

    public static void main(String[] args) {
        //Declaring the scanner
        Scanner scan = new Scanner(System.in);

        //Getting the number of integers to scan
        int n = scan.nextInt();

        //Declaring a numbers array
        int[] numbers = new int[n];

        //Scanning the integers
        for(int i=0; i<n; i++)
            numbers[i] = scan.nextInt();

        //Determining if numbers are prime
        for(int i=0; i<n; i++)
        {
            boolean isPrime = true;
            for(int j=2; j<n; j++)
            {
                if(numbers[i] % j == 0){
                    isPrime = false;
                    System.out.println("Not prime");
                    break;
                }
            }
            if(isPrime)
                System.out.println("Prime");
        }

    }
}

【问题讨论】:

  • 为什么要循环到n 不是你要检查的整数个数是否是素数吗?你应该循环到numbers[i]/2
  • 重构你的代码,你可能会修复这个错误。编写一个方法boolean isPrime(int number) 并在你的方法中调用它。更小、更简单的方法为您所拥有的错误留出的空间要小得多。另外,使用 foreach 循环。再次,减少错误的空间。
  • Math.ceil(Math.sqrt(numbers[i]));
  • 或检查直到j * j &lt;= n。更好的方法是使用 sieve of eratosthenes 预先计算一定范围内的素数
  • @SiddarthSreeni 我只是想让它工作,我打算除以二来优化我的代码,但后来。

标签: java algorithm loops conditional-statements primes


【解决方案1】:

您可以考虑两点:

A.您需要检查直到其平方根的数字,即如果一个整数不能被从 2 到其平方根的任何整数整除,则它是素数

B.您不需要额外的boolean 标志(即代码中的isPrime)。

import java.util.Scanner;

public class Solution {

    public static void main(String[] args) {
        // Declaring the scanner
        Scanner scan = new Scanner(System.in);

        // Getting the number of integers to scan
        System.out.print("How many numbers: ");
        int n = scan.nextInt();

        // Declaring a numbers array
        int[] numbers = new int[n];

        // Scanning the integers
        for (int i = 0; i < n; i++) {
            System.out.print("Enter number " + (i + 1) + ": ");
            numbers[i] = scan.nextInt();
        }

        // Determining if numbers are prime
        for (int i = 0; i < n; i++) {
            int j, upperRange = (int) Math.sqrt(numbers[i]);
            for (j = 2; j <= upperRange; j++)
                if (numbers[i] % j == 0)
                    break;
            if (numbers[i] != 1 && j > upperRange)
                System.out.println(numbers[i] + " is Prime");
            else
                System.out.println(numbers[i] + " is not Prime");
        }

    }
}

示例运行:

How many numbers: 5
Enter number 1: 256
Enter number 2: 289
Enter number 3: 1
Enter number 4: 5
Enter number 5: 7
256 is not Prime
289 is not Prime
1 is not Prime
5 is Prime
7 is Prime

【讨论】:

    【解决方案2】:

    合并代码并使用 Math.sqrt() 重构你的代码到这个

    public boolean isPrime(int number){
     if(number==1){
      return false;
     }
     boolean isPrime = true;
     int maxN = Math.ceil(Math.sqrt(number));
     for(int j=2; j< maxN; j++){
      if(number % j == 0){
        isPrime = false;
        break;
      } 
     }
     return isPrime;
    }
    

    【讨论】:

    • 请总结为什么您的代码可以正常工作。另外,格式化您的代码。
    【解决方案3】:

    这是更新后的代码

    public class Solution {
    
    public static void main(String[] args) {
        //Declaring the scanner
        Scanner scan = new Scanner(System.in);
    
        //Getting the number of integers to scan
        int n = scan.nextInt();
    
        //Declaring a numbers array
        int[] numbers = new int[n];
    
        //Scanning the integers
        for(int i=0; i<n; i++)
            numbers[i] = scan.nextInt();
    
        //Determining if numbers are prime
        for(int i=0; i<n; i++)
        {
            checkPrime(numbers[i]);
        }
    
    }
    
    private static void checkPrime(int number) {
        boolean isPrime = true;
        int limit = (int) Math.ceil(Math.sqrt(number));
        for(int j=2; j<=limit; j++)
        {
            if(number >2 && number % j == 0){
                isPrime = false;
                break;
            }
        }
        if(number> 1 && isPrime)
            System.out.println(number + " is Prime");
        else
             System.out.println(number + " is not prime");
    
    }
    

    }

    样本输出

    > 5 
    > 1 2 3 4 33
    
    1 is not prime
    2 is Prime
    3 is Prime
    4 is not prime
    33 is not prime
    

    【讨论】:

      猜你喜欢
      • 2014-03-08
      • 2012-09-02
      • 2020-12-03
      • 1970-01-01
      • 2013-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多