最大公约数的算法及其证明
# include <stdio.h>
int GCD(int A,int B)
{
while (B != 0)
{
int remainder = A % B; //A对B取余,若A<B,则余数为B;
A = B; //B作为被除数
B = remainder ; //余数作为除数
}
return A;
}
int main()
{
int a,b;
scanf("%d %d", &a, &b);
a = GCD(a, b);
printf("最大公约数是%d\n", a);
return 0;
}
该算法时间复杂度为O(logB),因为每两次的while循环中,B的值就减少一半。
欧几里得算法:GCD(A,B)=GCD(B, A Mod B)。
要理解为什么这是正确的,可以考虑取模运算符的定义。如果余数 R=d Mod B,那么对于整数m,A=m×B+R。如果g是4和B的最大公约数,g是B约数,所以g也必定是m×B 的约数。因为g是A的约数并且A=mXB+R,g 必定是mXB+R的约数。因为g是m×B的约数,它也一定是R的约数。
这证明了g是B和R的约数。g=GCD(B,R)的意思是 g是能够约分B和R的最大
整数。
[^1]参考《算法基础》