求 x 和 y 的最大公因数m:
思路: (把最大公因数不变的两个数尽量缩小)
既然m是他们两个的最大公因数,则m可以整除他们两个,即x是m的倍数,y也是m倍数,
假设x>y,则x-y 等于 m的倍数 - m的倍数,其结果一定能被m整除,
x一直减y,x-y-y-y……,直到余数比y小,称余数为c,c由两个m的倍数相减而来,所以c依旧是m的倍数,且是目前最小的m的倍数,
所以用y和c两个小的数,代替x和y两个大的数,最大公因数是一样的,
而x-y-y-y……减到不能再减,其实就是x÷y,取x内最大倍的y,所以用x%y求c,
如果c为0,则y就是最大公因数,否则一直找两个小的数来计算,直到模为0
下面是代码:
1.迭代法:
int gcd(int x, int y)
{
int tem, c;
if(x == 0)
return y;
if(y == 0)
return x;
if(x < y) //保证x > y来求余
{tem = x; x = y; y = tem;}
c = x % y;
while(c) //直到余数 c 为0
{
x = y;
y = c;
c = x % y;
}
return y;
}
- 递归法
int gcd(int x, int y)
{
if(y == 0)
return x; //上一次余数给了这次的 y,上一次的除数给了这次的 x
return gcd(y, x%y); //gcd(小的,余数)
}
int main(void)
{
//默认有 x 和 y
if(x > y)
Swap(x, y); //交换两个数
printf("%d\n", gcd(x, y));
return 0;
}