輾轉相除法,一種求最大公約數的算法
已知:A / B = C ······ R (A、B、C、R皆是整數)
假設:D是A的余數,D也是B的余數,那么D就是A和B的公約數
D是A和B的約數,則A和B是D的倍數,B * C也是D的倍數
既然A與B*C都是D的倍數,那么A與B*C的差也是D的倍數
A - B*C = R
所以R也是D的倍數
如果D是A或B的公約數,那么D也是B和R的公約數
故:(A,B)= (B,R)
由以上證明則可以求出最大的公約數
例如:求72和28的最大公約數
72 / 28 = 2 ······ 16
↓ ↓ ↓ ↓
28 / 16 = 1 ······ 12
↓ ↓ ↓ ↓
16 / 12 = 1 ······ 4
↓ ↓ ↓ ↓
12 / 4 = 3 ······ 0
現在可以知道 72與28的最大公約數是4
1 #include <stdio.h> 2 int main(){ 3 int a; // 除數 4 int b; // 被除數 5 int r=1; // 余數,賦初值為1 6 printf("輸入除數與被除數(空格分開):"); 7 scanf("%d %d",&a,&b); 8 while(r!=0){ // 如果a<b,亦無需顛倒ab,在計算中商0余除數本身,在下次運算中自可顛倒回來 9 r = a % b; 10 a = b; 11 b = r; 12 } 13 printf("最大公約數為:%d\n",a); // 此時b的值已經在a中了,所以輸出的a就是最大公約數 14 return 0; 15 }