[英]Getting weird output while finding prime number in java
我有兩種方法可以找出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
在isPrime()
方法中,您不應該檢查num % i == 0
而不是exp % 2 == 0
嗎?
看一下這段代碼
if(exp%2==0){
它應該是num % i
像這樣更改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;
}
因為在if條件下,您正在檢查exp%2 == 0
。 但是,當對i < exp
迭代時,該語句不會更改。 因此,此邏輯應以num % i == 0
開啟
好吧,我認為罪魁禍首是if(exp%2==0){
並且它在迭代i<exp
時引起問題,因此您可能需要將其調整為num%i==0
我試圖給出其他一些方法來解決這個問題。 我希望這會有所幫助。
我認為有一個誘使您使用的原因
(int)Math.sqrt(num);
我試圖在下面詳細說明。
考慮以下3種方法。 所有這些都是正確的,但是前兩種方法有一些缺點。
方法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個以發現一個數為質數),到僅檢查整數的一半直至平方根 。 這不是一種改進,特別是考慮到數量很大時。
好吧,您的第一個算法幾乎是正確的(用%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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.