辗转相除法,一种求最大公约数的算法
已知: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 ",a); // 此时b的值已经在a中了,所以输出的a就是最大公约数 14 return 0; 15 }