[Java]检查一个数字是否是质数,使用额外的isPrime标志不能工作[关闭]

问题描述 投票:-2回答:4

我在2017年问过这个问题。我在2020年更新了这些代码下。

这道题是检查这个数是不是质数,当然已经有不同的答案了。但是我试了一天,都找不到为什么我的方法不能正常使用。

public class PrimeNum 
{
    private static boolean isPrime;
    private static Scanner input;

    public static void main(String[] args)
    {
        input = new Scanner(System.in);
        System.out.println("Enter a prime number ( you think ) : ");
        int num = input.nextInt();

        isPrime = false;
        for(int divisor = 2; divisor < num / 2; divisor++) {
            if(num % divisor == 0)
            {

                isPrime = false;
            }
            isPrime = true;
        }
        if(isPrime)
        {
            System.out.println("Prime");

        }
        else
        {
            System.out.println("Not a prime");
        }
    }
}

2020年5月更新。

我意识到我问了一个愚蠢的问题. 主要的原因是这里没有工作:

           isPrime = false;
           for(int divisor = 2; divisor < num / 2; divisor++) {
                if(num % divisor == 0)
                {

                    isPrime = false;
                }
                isPrime = true; // May 2020: no matter what num, it will become true here.
            }

  • divisor < num 2 -> 它不会检查数字3, 4... 因为除数是从2开始的, 而且永远不会小于32=1, 42=2. 这里需要改成divisor < num.
  • isPrime = true -> 无论num是多少,isPrime都会变成true。所以我需要简单的添加 else round isPrime = true。
  • 其实我们只需要检查这个数字是不是自己,如果它被除数除掉了,那么它就是假的。
  • 把函数放在main之外总是好的,这样我们就可以使用它。最后的解决方案。
    import java.util.*;
    class Prime {
        public static void main(String[] args){
            Scanner input = new Scanner(System.in);
            System.out.println("Enter a prime number ( you think ) : ");
            int num = input.nextInt();
            if(ifPrime(num)) {
                 System.out.println(num + " is a prime number");
            }
            else {
                System.out.println(num + " is a NOT prime number");
            }
        }
        private static boolean ifPrime(int num) {
    
            for(int divisor = 2; divisor < num; divisor++) {
                if( num != divisor && num % divisor == 0){
                    return false;
                }
            }
            return true;
        }
    }
    
  • java primes
    4个回答
    6
    投票

    这里的主要问题是,你覆盖的值是 isPrime 所以,如果你检查的最后一个除数没有除以 num你把它解释为素数。

    一个更好的方法是假设一个数字是质数,直到被证明不是质数(即,直到你找到它的除数)。一旦你找到了这样一个除数,你就可以 break 出循环--这个数字不是质数,没有理由继续检查它。

    isPrime = true;
    for(int divisor = 2; divisor <= num / 2; divisor++) {
        if (num % divisor == 0) {
            isPrime = false;
            break; // num is not a prime, no reason to continue checking
        }
    }
    

    2
    投票

    在你的代码中

    for(int divisor = 2; divisor < num / 2; divisor++) {
        if(num % divisor == 0)
        {
    
            isPrime = false;
        }
        isPrime = true;
    }
    

    如果isPrime=false,那么你又把它变成了true!

    你可以考虑这个。

        isPrime = true;
        for(int divisor = 2; divisor < num / 2; divisor++) {
            if(num % divisor == 0)
            {
                isPrime = false;
                break;
            }
        }
    

    -1
    投票

    用这个试试

    public class prime{
    public static void main (String args[]){
    int n1=100, n2=1000;
    int c=0;
    for(int i=n1; i<=n2; i++)
        if(isPrime(i)==true)
            c++;
        System.out.print(c);
    }
    public static boolean isPrime(int number)
    {
    
        for(int j=2; j<number; j++) //u go from number+1 to number to check 
                                    //if it can be divided by any other value.
            if(number % j ==0) //if there is 1 other number that divides it then
                               //it returns false.
                return false;
    
            return true; //else it returns true.
    }
    }
    

    -2
    投票

    public class PrimeNum {

    private static boolean isPrime;
    private static Scanner input;
    
    public static void main(String[] args) {
        input = new Scanner(System.in);
        System.out.println("Enter a number ( you think ) : ");
        String ch = input.next();
    
        if (isNumeric(ch)) {
            int num = Integer.parseInt(ch);
            isPrime = true;
            if (num > 1) {
                for (int divisor = 2; divisor * divisor <= num; divisor++) {
                    if (num % divisor == 0) {
                        isPrime = false;
                        break;
                    }
                }
            } else {
                isPrime = false;
            }
    
            if (isPrime) {
                System.out.println("Prime");
    
            } else {
                System.out.println("Not a prime");
            }
        } else {
            System.out.println("Should input a number");
        }
    }
    
    public static boolean isNumeric(String str) {
        Pattern pattern = Pattern.compile("[0-9]*|\\-[0-9]*");
        Matcher isNum = pattern.matcher(str);
        if (!isNum.matches()) {
            return false;
        }
        return true;
    }
    

    }

    © www.soinside.com 2019 - 2024. All rights reserved.