求最大公约数有两种方法:更相减损法,辗转相除法
两种方法原理相同,辗转相除法更简洁
1.更相减损法
假设有两个数161和63,设它们的最大公约数为x
161和63都能被x整除,则它们的差161-63=98也能被x整除,所以求161和63的最大公约数变成求98和63的最大公约数,且98和63的最大公约数仍然是x。
98和63都能被x整除,则它们的差98-63=35也能被x整除,所以求98和63的最大公约数变成求63和35的最大公约数,且63和35的最大公约数仍然是x。
同理 63-35=28 求28和35的最大公约数
35-28=7 求28和7的最大公约数
28-7=21 求21和7的最大公约数
21-7=14 求14和7的最大公约数
14-7=7 求7和7的最大公约数,即x=7
直到两个数相同,最大公约数即为其本身。
代码实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//gcd(greateest commom divisor) 最大公约数
int get_gcd(int x, int y) {
int z = 0;
while (1) {
if (x > y) {
z = x - y;
x = y;
y = z;
}
else if (x < y) {
z = y - x;
y = x;
x = z;
}
else
return x;
//此处return直接终止函数,while循环的break可以省略
}
}
int main() {
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
int gcd = get_gcd(a, b);
printf("%d", gcd);
return 0;
}
2.辗转相除法
同样假设有两个数161和63,设它们的最大公约数为x
161/63=2余35
63/35=1余28
35/ 28=1余7
28/7=4余0(余0代表可以整除)
所以x=7
代码实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int get_gcd(int x, int y) {
int z = 1;
if (x > y) {
while (z!=0) {
z = x % y;
x = y;
y = z;
}
return x;
}
else if (x < y) {
while (z != 0) {
z = y % x;
y = x;
x = z;
}
return y;
}
else
return x;
}
int main() {
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
int gcd = get_gcd(a, b);
printf("%d", gcd);
return 0;
}