任何想法爲什麼這個方法爲'4'返回true?爲什麼我的程序認爲4是一個素數?
private boolean isPrime(int num) {
if (num < 2) {
return false;
}
for (int i = 2; i < num/2; i++) {
if (num % i == 0)
return false;
}
return true;
}
任何想法爲什麼這個方法爲'4'返回true?爲什麼我的程序認爲4是一個素數?
private boolean isPrime(int num) {
if (num < 2) {
return false;
}
for (int i = 2; i < num/2; i++) {
if (num % i == 0)
return false;
}
return true;
}
,因爲你的循環從2
開始,在num/2 -1
這在num = 4
的情況下1
結束返回TRUE。這意味着你永遠不會進入for循環。
你for
迴路應
for (int i = 2; i <= num/2; i++)
注意,你的循環運行時間將O(num)
。對於更高的效率,你可能要考慮循環
for (int i = 2; i * i <= num; i++)
這是O(sqrt(num))
。
它正在返回true
因爲控制永遠不會進入for
循環內部。
for(int i = 2; i < num/2; i++) { ... }
這裏num
是4
然後num/2
將2
for(int i = 2; i < 2; i++) { ... }
,最初我是2這是不小於2。所以i < 2
會給假。
所以你的循環永遠不會運行。並且函數將返回true
更有效的解決方案是檢查2後跟奇數到sqrt(n),因爲上面的任何數字都意味着有一個小於這個的因子。
static boolean isPrime(long num) {
if (num < 2) return false;
if (num == 2) return true;
if ((num & 1) == 0) return false; // must be even
for (int i = 3, max = (int) Math.sqrt(num); i <= max; i += 2)
if (num % i == 0)
return false;
return true;
}
我確定你的調試器可以幫助你調試你的程序。如果你不知道如何使用你的調試器,我建議你學習。 –
順便說一句,更有效的方法是執行'for(int i = 2,max =(int)Math.sqrt(num); i <= max; i ++)'您可以通過檢查後僅檢查奇數來進一步改進'2'是一個因素。在這種情況下, –
總是傾向於調試。 –