[Java]检查一个数字是否为素数,使用extra-isPrime标志不起作用 我在2017年问了这个问题。我在2020年根据这些准则进行了更新。

[Java]检查一个数字是否为素数,使用extra-isPrime标志不起作用 我在2017年问了这个问题。我在2020年根据这些准则进行了更新。,java,primes,Java,Primes,这个问题是检查数字是否为素数,当然已经有不同的答案了。 但是我已经试了一整天,我不知道为什么我的方法不能正常工作 public class PrimeNum { private static boolean isPrime; private static Scanner input; public static void main(String[] args) { input = new Scanner(System.in);

这个问题是检查数字是否为素数,当然已经有不同的答案了。 但是我已经试了一整天,我不知道为什么我的方法不能正常工作

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");
        }
    }
}
公共类素数
{
私有静态布尔互质;
专用静态扫描仪输入;
公共静态void main(字符串[]args)
{
输入=新扫描仪(System.in);
System.out.println(“输入一个素数(您认为):”;
int num=input.nextInt();
isPrime=false;
for(整型除数=2;除数
2020年5月更新: 我意识到我在问一个愚蠢的问题。 主要原因是没有在这里工作:

isPrime=false;
for(整型除数=2;除数
除数它不会检查数字3、4。。。因为除数是从2开始的,并且永远不会小于3/2=1,4/2=2。这里需要更改为除数isPrime=true->无论num是多少,isPrime都将变为true。所以我需要简单地在isPrime=true中加上else。
  • 实际上,我们只需要检查这个数字是否不是它本身,如果它可以被除数整除,那么它就是假的。
  • 把函数放在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;
        }
    }
    
    import java.util.*;
    类素数{
    公共静态void main(字符串[]args){
    扫描仪输入=新扫描仪(System.in);
    System.out.println(“输入一个素数(您认为):”;
    int num=input.nextInt();
    if(ifPrime(num)){
    System.out.println(num+“是一个素数”);
    }
    否则{
    System.out.println(num+“不是素数”);
    }
    }
    私有静态布尔ifPrime(int num){
    for(整型除数=2;除数
    在您的代码中

    for(int divisor = 2; divisor < num / 2; divisor++) {
        if(num % divisor == 0)
        {
    
            isPrime = false;
        }
        isPrime = true;
    }
    
    for(整型除数=2;除数
    如果isPrime=false,那么您可以再次将其设置为true

    你可以考虑这个问题:

        isPrime = true;
        for(int divisor = 2; divisor < num / 2; divisor++) {
            if(num % divisor == 0)
            {
                isPrime = false;
                break;
            }
        }
    
    isPrime=true;
    for(整型除数=2;除数
    这里的主要问题是在每次迭代中覆盖
    isPrime
    的值,因此如果您检查的最后一个除数没有除以
    num
    ,则将其解释为素数

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

    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
        }
    }
    
    isPrime=true;
    
    对于(整型除数=2;除数公共类素数){

    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;
    }
    
    私有静态布尔isPrime;
    专用静态扫描仪输入;
    公共静态void main(字符串[]args){
    输入=新扫描仪(System.in);
    System.out.println(“输入一个数字(您认为):”;
    字符串ch=input.next();
    如果(是数字(ch)){
    int num=Integer.parseInt(ch);
    isPrime=true;
    如果(num>1){
    对于(整型除数=2;除数*除数请尝试以下方法:

    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.
    }
    }
    
    公共类素数{
    公共静态void main(字符串参数[]){
    int n1=100,n2=1000;
    int c=0;
    
    for(int i=n1;iperhaps
    break;
    可能有用?@thomasewin i在isPrime=false之后添加,效果更好,但不适用于“3”、“5”,适用于“17”.@Xiaologli看到我的答案了为什么。@WendingPeng我看到了你的答案,你是对的!谢谢。我已经运行了你的代码,它看起来很有效。或者简单地返回true。@Krythic除非它是布尔方法,否则你不能返回true。如果我用这种方式,如果我键入4,它会说它是素数。但是如果我改为for(int divisor=2;divisordivisor
    )确实错了,正如你所说的。你应该停下来(
    divisor哇,它成功了!!!天哪,你知道从这个小问题中,我学到了很多!非常感谢你!只要停在
    divisor,如果你评论你的答案并告诉它为什么解决了这个问题就好了。一个好的答案不仅仅局限于粘贴一些代码。