#55: 如何利用c和c++簡潔地寫出輾轉相除法


s311094 (wills1)

學校 : 國立新竹科學園區實驗高級中等學校
編號 : 5062
來源 : [59.120.188.205]
最後登入時間 :
2024-12-24 07:19:56
a043. 最大公因數 | From: [111.253.62.57] | 發表日期 : 2024-11-03 02:53

如果你是不會輾轉相除法

題目給的提示是輾轉相除法 輾轉相除法是利用兩數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是做不到的

 

 

以上 祝編寫順利

 
ZeroJudge Forum