求兩數最大公約數的方法有很多,這里重點介紹這兩種算法:
輾轉相除法 和 更相減損法。
1、輾轉相除法。
在兩個數中,找出大數,用大數除以小數,得到整數商和余數,然后再不斷地用除數(原來的小數)除以余數,直到沒有余數為止。
那么除數即為最大公約數。
所以我們可以用一個循環來進行被除數、除數和余數之間的位置互換。
也可以用goto語句來進行循環操作。
要注意的是,goto語句在一個程序當中最好不要多次出現,否則程序很有可能混亂。
這里給出一個利用goto語句完成的程序代碼:
#include<stdio.h> int main() { int a = 6, b = 16,t; if (a < b) { t = a; a = b; b = t; } flag: if (a%b == 0) { printf("%d\n", b); } else { t = a; a = b; b = t%b; goto flag; } system("pause"); return 0; }
PS:如果用循環來做的時候,我們需要將flag~goto語句中間的部分作為循環體。
2、更相減損法。
這個算法原出自於《九章算術》中,將算法內容用現代漢語翻譯后為:
第一步:任意給定兩個正整數;判斷它們是否都是偶數。若是,則用2約簡;若不是則執行第二步。
第二步:以較大的數減較小的數,接着把所得的差與較小的數比較,並以大數減小數。繼續這個操作,直到所得的減數和差相等為止。
則第一步中約掉的若干個2與第二步中等數的乘積就是所求的最大公約數。
代碼如下:
#include<stdio.h> #include<math.h> int main() { int i = 0, t, x, a = 6, b = 16, result; while ((a % 2 == 0) && (b % 2 == 0)) { a /= 2; b /= 2; i += 1; } if (a < b) { t = a; a = b; b = t; } do { x = a - b; if (b == x) break; a = (b > x) ? b : x; b = (b < x) ? b : x; } while (x); if (i == 0) { result = b; printf("%d\n", result); } else { result = (int)pow(2, i)*b; printf("%d\n", result); } system("pause"); return 0; }
兩種方法相比,輾轉相除法的代碼效率更高,所以更推薦使用輾轉相除法。
最后附上程序運行的結果: