這是從網路上看到的,想理解這寫法,謝謝!
int main ()
{
for (int i=2; i<100; i++)
for (int j=2; j<i; j++)
{
if (i % j == 0)
break;
else if (i == j+1)
cout << i << " ";
}
return 0;
}
由程式碼「反推」回去
1.題目是「顯示2到99的質數」
2.答案是
兩層迴圈,外面是「2到99」(i)
裡面是「2到比自己小1的數」(j)
如果i可被j整除,表示不是質數
否則當j剛好比i小1時(所有數字都已判斷過,表示i是質數),就把 i 顯示出來
提供我高中剛接觸時的學習方式,這種簡單的題目,可以透過列出前10筆的方式去窮舉一下,讓自己容易思考。
j\i | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|---|---|---|---|---|
2 | X | O | O | O | O | O | O | O | O | O |
3 | X | X | O | O | O | O | O | O | O | O |
4 | X | X | X | O | O | O | O | O | O | O |
5 | X | X | X | X | O | O | O | O | O | O |
6 | X | X | X | X | X | O | O | O | O | O |
7 | X | X | X | X | X | X | O | O | O | O |
8 | X | X | X | X | X | X | X | O | O | O |
9 | X | X | X | X | X | X | X | X | O | O |
10 | X | X | X | X | X | X | X | X | X | O |
11 | X | X | X | X | X | X | X | X | X | X |
int main ()
{
for (int i=2; i<100; i++)
for (int j=2; j<i; j++){
if (i % j == 0) break;
else if (i == j+1) cout << i << " ";
}
return 0;
}
因為迴圈條件 “j<i”
你要打印出經過檢核的質數i
就只能在同過最後一個條件“除了1與自己無法被其他數整除”時打印i
故i==j+i
簡單,你直接把那段拿掉,執行就知道了
int main ()
{
for (int i=2; i<100; i++)
for (int j=2; j<i; j++){
if (i % j == 0)
break;
}
return 0;
}
很明顯因為沒有cout
,所以log什麼都沒有。
那cout
要放哪裡比較適合?
答案是,確定找到解答
的瞬間。
int main ()
{
for (int i=2; i<100; i++)
for (int j=2; j<i; j++)
{
if (i % j == 0)
break;
else if (i == j+1)
cout << i << " ";
}
return 0;
}
這段程式碼是一個用來找出2到100之間的所有質數的程式,其邏輯是透過兩個for迴圈,分別將每個數字都和前面所有的數字進行除法運算,如果前面的數字能整除當前的數字,就代表這個數字不是質數,因此就會跳出第二個for迴圈,進入下一個數字的檢查。
當檢查完前面所有的數字後,如果當前的數字還沒被判斷為非質數,也就是說它是質數的可能性較高,就會進入第二個判斷式if (i == j+1) 的判斷。這個判斷式的意思是:如果當前的數字i比前面所有檢查過的數字j都大1,那麼就代表這個數字i是質數。這是因為在第二個for迴圈中,j最後會停在比i小1的位置,如果此時i和j相等,那麼代表i被j整除了,因此i不是質數。只有在i比j大1的情況下,i才不會被前面的任何數字整除,才有可能是質數。當i被判斷為質數時,就會使用cout << i << " "; 將它印出來。