我有两种方法可以找出java方法中的质数-2可以正常工作,但是从方法一中得到错误的输出,可以帮助我在逻辑上做错的地方。预先感谢
我的整个代码
package prepare;
import java.util.Scanner;
public class Squar {
//Method - 1 to find prime number
boolean isPrime(int num){
int exp = (int)Math.sqrt(num);
for(int i=2;i<exp;i++){
if(exp%2==0){
return false;
}
}return true;
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
Squar s = new Squar();
System.out.println("From M1 "+s.isPrime(num));
scan.close();
System.out.println("From M2 "+s.isPrimeNumber(num));
}
//Method - 2 to find prime number
public boolean isPrimeNumber(int number) {
if(number == 1){
return false;
}
if (number == 2 || number == 3) {
return true;
}
if (number % 2 == 0) {
return false;
}
int sqrt = (int) Math.sqrt(number) + 1;
for (int i = 3; i < sqrt; i += 2) {
if (number % i == 0) {
return false;
}
}
return true;
}
}
输入的:63实际输出的素数为假,但得到 与方法一不同的输出 输出
63
From M1 true
From M2 false
答案 0 :(得分:2)
在isPrime()
方法中,您是否应该检查num % i == 0
而不是exp % 2 == 0
?
答案 1 :(得分:1)
看看这段代码
if(exp%2==0){
应为num % i
答案 2 :(得分:1)
像这样更改isPrime
函数。
boolean isPrime(int num) {
int exp = (int) Math.sqrt(num);
for (int i = 2; i < exp; i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
因为处于条件状态,您正在检查exp%2 == 0
。但是,在i < exp
上进行迭代时,此语句不会更改。因此,应该使用num % i == 0
答案 3 :(得分:1)
我认为罪魁祸首是
if(exp%2==0){
并且在迭代i<exp
时引起问题。因此,您可能需要对其进行调整
num%i==0
我已尝试给出其他一些解决此问题的方法。 我希望这会有所帮助。
我认为有一个诱使您使用的原因
(int)Math.sqrt(num);
我尝试在下面详细说明。
请考虑以下3种方法。 所有这些都是正确的,但是前2种方法有一些缺点。
方法1
boolean isPrime(int num) {
for(int i=2;i<num;i++) {
if(num%i==0)
return false;
}
return true;
}
我们有能力使其更快。
请考虑如果2除以某个整数n,则(n / 2)也将n除。 这表明我们不必尝试2到n之间的所有整数。
现在我们可以修改算法:
方法2
//checks whether an int is prime or not.
boolean isPrime(int num) {
for(int i=2;2*i<num;i++) {
if(num%i==0)
return false;
}
return true;
}
最后,我们知道2是“奇数”素数-它恰好是唯一的偶数素数。 因此,我们只需要单独检查2,然后遍历奇数直到n的平方根即可。 我认为这可能会诱使您使用(int)Math.sqrt(num);
方法3
//checks whether an int is prime or not.
boolean isPrime(int num) {
//check if num is a multiple of 2
if (num%2==0) return false;
//if not, then just check the odds
for(int i=3;i*i<=num;i+=2) {
if(num%i==0)
return false;
}
return true;
}
因此,我们已经从检查每个整数(最多检查n个以发现一个数为质数)变为仅检查一半的整数 到平方根。 这不是一种改善,特别是考虑到数字很大时。
答案 4 :(得分:0)
好吧,您的第一个算法几乎是正确的(用%i代替%2)。我不知道第二种算法,但是我一定会将其更改为以下形式:
public boolean isPrime(int n) {
if (n <= 1) {
return false;
}
for (int i = 2; i < Math.sqrt(n); i++) {
if (n % i == 0) {
return false;
}
}
return true;
}