检查数字是否为素数,不通过使用额外的 isPrime 标志来工作

Checking if a number is prime, not working by using extra isPrime flag

(1) 原题及有问题的解决方案: 这道题是检查数字是否为质数。

        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");
            }
        }

(2) ###更新: 不起作用的主要原因是导致问题的标志:isPrime = true;

           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.
            }

(3) ###更新:使用方法的工作解决方案:

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;
    }
}

在你的代码中

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

        isPrime = false;
    }
    isPrime = true;
}

如果 isPrime = false,那么你再次使它为真!

你可以考虑这个:

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

这里的主要问题是您在每次迭代中都覆盖了 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
    }
}

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;
}

}

试试这个:

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.
}
}