題目給的提示是輾轉相除法 輾轉相除法是利用兩數a%b的值c 再進行b%c=d 直到餘數為0
例如(假設%是取餘數運算) 18和48, 18%48=18 ,48%18=12, 18%12=6, 12%6=0 那麼18和48的最大公因數就是6
前導到此結束 進入正題(還沒做完只是來找提示的可以先做完再往下看 下面沒有答案)
提醒:我使用C++執行 但理論上C也可以 (沒嘗試過 ww
看到標題就知道我要說什麼的可以跳過
除了Python外 其他三種程式語言(C,C++,Java)都支持自增(++)和自減(--) 這兩個功能有前後置運算的差別:
例如c++:
int a = 5;
int b = a++; //b是5 (先把a放到b裡面 然後a再+1 a現在是6)
int c = ++a; //c是7 (先把a+1 現在a是7 然後再把a放到c裡)
//a是7
前置運算就是把++或--放在前面 會先執行再做其他操作, 後置運算就是把++或--放在後面 會先做其他操作再執行
這些運算和完整理解接下來的技巧有關 雖然這題題目不會用到
除了Python外 其他三種程式語言(C,C++,Java)都支持在條件中進行賦值運算:
例如c++:
while ((++a) < b);
這段代碼的a會不斷+1 直到不再小於b為止 同時在while後面的分號可以宣告結構的結束(可以不用加上空的大括號)
執行順序上是 執行前置運算和一般運算⭢判斷值⭢執行後置運算⭢執行大括號中的內容(如果條件成立)
例如while ((++a) < b); 且 a=0,b=2:
a+=1, a=1, b=2 ⭢ a<b(True) ⭢ 執行大括號中的內容(但這裡沒有)
a+=1, a=2. b=2 ⭢ a=b(False) (執行結束跳出迴圈 同時如果大括號中有內容 這輪不會被執行)
結果: a=2, b=2
但如果是while ((a++) < b); 且 a=0,b=2:
a=0, b=2 ⭢ a<b(True) ⭢ a+=1 ⭢ 執行大括號中的內容
a=1, b=2 ⭢ a<b(True) ⭢ a+=1 ⭢ 執行大括號中的內容
a=2, b=2 ⭢ a=b(False) ⭢ a+=1 ⭢ (執行結束跳出迴圈)
結果: a=3, b=2
除了Java外 其他三種程式語言(C.C++,Python)都支持在條件中使用0和其他數值表示True/False, 0代表False, 其他任何數字都代表True
例如:c++:
if (0) { //這不會被執行 }
if (1) { //這會被執行 }
可以使用and或or(&&和||)來進行更多判定 例如: if (1 && 0) { //這不會被執行 }
結合以上三者 我們可以透過僅一行程式完成整個輾轉相除的運算
這邊舉個小例子 但是和題目解答無關:
c++:
while ((output+=number)&&(--number));
在output能存數字且number為正整數的情況下 這段代碼可以執行從1開始的加總運算
例如number輸入10 則會執行1加總到10(實際執行上是從10+9+8....+1) 而結果55會被加在output當中
邏輯: number為10,(假設)output為0 ⭢ output變為10, number變為9, 判定為True, 執行繼續...... ⭢ number為1, output為54 ⭢ output變為55, number變為0, 判定為False ⭢ 迴圈結束
(如果--number改成number--的話 會多執行一次+0的運算 因為被判斷的是number原本的數字 執行結束後的number會是-1, 加法來看還好 如果是乘法就很致命了)
想到怎麼樣用一行做出輾轉相除法的效果了嗎?
會用到的技巧: 在條件判斷式中做運算 和 數字和邏輯運算
思考一下: 輾轉相除法哪裡會出現0 可以輔助你跳出迴圈? 需要多少條件式來運算?
輾轉相除法只需要兩個東西 一個是除數 一個是餘數
如果無法判斷哪個變數會儲存結果 0加上任何數都是那個數
大括號裡面不需要任何東西 如果做出這個文章要告訴你的效果的話 應該只有三行: 輸入,輾轉相除法,輸出
可以這樣操作的只有C和C++, Python和Java是做不到的
以上 祝編寫順利