我的代码仅适用于少数数字,但在大多数数字上完全失败,我不明白为什么。它的目的是返回数字,如果是质数则返回 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);
首先,在循环的每次迭代中将
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;
}
}
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");
}
=
循环条件中添加
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;
}