As @Zaid pointed out,無限循環是由內部的n--
引起的if
聲明。 if
條件最終會失敗,所以它最終會陷入無限循環。
原來內部while循環是另一個循環。
for(n = 10; n > 1; n--)
這種錯誤就是爲什麼使用循環,它明確規定了初始化,終止條件,並且遞增。
這不會使代碼工作,但它不是無限的。
你基本上試圖做的是每個數字,嘗試將它除以低於自身的每個數字。
for(i = 10; i > 1; i--) { // every number from 10 to 2
for(n = i-1; n > 1; n--) { // every number lower than i to 2.
if(i % n == 0) {
printf("%d is not a prime number\n", i);
break;
}
}
// If n reached 1, it made it through the sieve.
if(n <= 1) {
printf("%d is a prime number\n", i);
}
}
注意,通過在我開始N - 1有沒有必要記住我比較反對N - 1,簡化了代碼,這是一個可能性就越小錯誤。
有幾種方法可以優化它。我們可以觀察以下幾件事:當n> i/2時,一個整數永遠不可能被均勻整除。所以10永遠不會被9,8,7或6整除。這意味着我們可以在i/2處開始計數n並保存一堆檢查。由於這是整數除法,所以i/2將總是舍入,不需要自己做。
因素越小,它就越有可能成爲除數。一半數字可以被2整除,1/3可以被3整除,1/5乘以5 ...因此,從底部開始並且增加n會更快。
#include<stdio.h>
int main(void) {
int num;
int divisor;
// From 10 to 2.
for(num = 10; num > 1; num--) {
// From 2 to num/2, no need to go further.
for(divisor = 2; divisor <= num/2; divisor++) {
if(num % divisor == 0) {
printf("%d is not a prime number\n", num);
break;
}
}
// If we got past num/2 it's prime
if(divisor > num/2) {
printf("%d is a prime number\n", num);
}
}
return 0;
}
我們可以更進一步,並觀察到偶數不是素數。這意味着偶數也永遠不是素數因數。如果我們以奇數開始,我們可以通過再次將檢查次數減半來計數。如果我們完全忽略偶數,這很容易。
#include<stdio.h>
int main(void) {
int num;
int divisor;
// Count down from 11 by 2s.
for(num = 11; num > 1; num -= 2) {
// From 3 to num/2. No need to check 2, we skipped even numbers.
for(divisor = 3; divisor <= num/2; divisor += 2) {
if(num % divisor == 0) {
printf("%d is not a prime number\n", num);
break;
}
}
// Same end condition as before.
if(divisor > num/2) {
printf("%d is a prime number\n", num);
}
}
// Special case for 2.
printf("2 is a prime number\n");
return 0;
}
如果你想所有的數字,你可以把一個特殊的情況下,主循環內,以檢查它是否是偶數。同樣,2是特殊的,因此我們不必在循環內持續檢查num!= 2。
#include<stdio.h>
int main(void) {
int num;
int divisor;
// Count down from 10 to 3, 2 is special cased.
for(num = 10; num > 2; num--) {
// Special case for even numbers so we can still do the
// for loop by 2s.
if(num % 2 == 0) {
printf("%d is not a prime number\n", num);
continue;
}
// 3 to num/2, odd numbers only.
for(divisor = 3; divisor <= num/2; divisor += 2) {
if(num % divisor == 0) {
printf("%d is not a prime number\n", num);
break;
}
}
if(divisor > num/2) {
printf("%d is a prime number\n", num);
}
}
// Again, special case for 2 to reduce code operations inside the loop
printf("2 is a prime number\n");
return 0;
}
所以,你必須打破';''前N - ;'?這可能是一個問題。我認爲你的意思是增加到'if'塊之後。 –
在調試器中單步執行代碼會在您花費更少的時間向您顯示邏輯錯誤,而不是將您的網站URL輸入到瀏覽器的地址欄中。你應該學會現在使用調試器;它是程序員工具箱中最重要的工具之一。 –