素数不显示正确答案

问题描述 投票:0回答:5

我的代码仅适用于少数数字,但在大多数数字上完全失败,我不明白为什么。它的目的是返回数字,如果是质数则返回 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);
java for-loop boolean
5个回答
2
投票

首先,在循环的每次迭代中将

primeFirst
设置为 true。您应该仅在循环之前设置它,这样在您找到一个因子后它就不会重置回 true。 primeSecond 也一样。这就是为什么 21 成为素数。

其次,您没有检查所有可能的因素,因为您的循环条件是

x< (Math.sqrt(first))

。这意味着循环将在测试平方根 itelf 之前停止,这就是 9 作为质数的原因。


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

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



2
投票
primeFirst

primeSecond
的值仅取决于循环的最后一次迭代。这可能适用于素数,但对于许多非素数肯定会失败。

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

我建议您不要使用这种逻辑,而是使用

威尔逊定理
。 它表示,如果对于一个数字 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"); }



2
投票
https://www.mkyong.com/java/how-to-define-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; }

我用几个不同的数字进行了尝试,一切正常!


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



-1
投票
© www.soinside.com 2019 - 2024. All rights reserved.