素数没有显示正确的答案

时间:2018-01-22 15:32:25

标签: java for-loop boolean

我的代码仅适用于少数几个数字,但在大多数数字中它完全失败,我无法弄清楚原因。它的意思是返回数字,如果是素数则返回true,如果不是素数则返回false。

int first = 6; 
int second = 7;
boolean primeFirst = false;
boolean primeSecond = false;


//first prime checker
for (int x = 2; x< (Math.sqrt(first)); x++)
{
  primeFirst = true; //prime
  if (first% x == 0)
  {
    primeFirst = false; //not prime
  }             
}

//second prime checker
for (int x = 2; x< (Math.sqrt(second)); x++)
{
  primeSecond = true; 
  if (second % x == 0)
  {
    primeSecond = false;                  
  }            
}

System.out.println(first + " is " + primeFirst);
System.out.println(second + " is " + primeSecond);

5 个答案:

答案 0 :(得分:2)

首先,在循环的每次迭代中将primeFirst设置为true。你应该在循环之前只设置,所以在找到一个因子后它不会重置为true。 primeSecond也是如此。这就是为什么21出现作为素数的原因。

其次,您没有检查每个可能的因素,因为您的循环条件是x< (Math.sqrt(first))。这意味着循环将在测试平方根之前停止,这就是为什么9出现为素数。

这是一个可能的固定版本:

boolean primeFirst = true;
double sqrtFirst = Math.sqrt(first);
for (int x = 2; x <= sqrtFirst; ++x) {
    if (first%x==0) {
        primeFirst = false;
        break;
    }
}

答案 1 :(得分:2)

我认为,这有效(https://www.mkyong.com/java/how-to-determine-a-prime-number-in-java/):

boolean isPrime(int n) {
    for(int i = 2; i <= Math.sqrt(n); i++) {
        if(n%i==0)
            return false;
    }
    return true;
}

我已尝试过几个不同的数字,一切正常!

答案 2 :(得分:2)

如果您看得正确,primeFirst&amp; primeSecond仅依赖于循环的最后一次迭代。这可能适用于素数,但对于许多非素数肯定会失败。

您的代码的另一个问题是x<(Math.sqrt(second))。它应该是x<=(Math.sqrt(second))


我建议你不要使用这个逻辑,使用Wilson's Theorem。 它表示如果某个p(p-1)!+1可以被p整除,则该数字为素数。

static int factorial(int n){
    if(n==0)
        return 1;
    else return n*factorial(n-1);
}

public static void main(String args[]) {
    int p = 6; //any number you want to test

    if((factorial(p-1)+1)%p==0)
        System.out.println(p+" is a prime number");
    else System.out.println(p+" is not a prime number");
}

答案 3 :(得分:1)

您以错误的方式使用它,必须在=循环条件中添加for

我认为不需要Math.sqrt(first),也不需要所有这些布尔值。

看到这个简单的代码:

public static void main(String[] args) {
    for (int i = 2; i <= 100; i++) {
        System.out.println(i + " is " + isPrime(i));
    }
}

public static boolean isPrime(int num) {
    for (int i = 2; i < num; i++) {
        if (num % i == 0)
            return false;
    }
    return true;
}

答案 4 :(得分:-1)

    int first=6;
    boolean primefirst=true;
    for(int i=2;i<=(Math.sqrt(first));i++)
    {
        if(first%i==0)
        {
            primefirst=false;
        }

    }
    String output=primefirst==true? "this is prime Number":"this is Not prime Number";

    System.out.println(first+" "+output);