求最大公约数(辗转相除法)
一个很神奇的算法,假设有两个数,一个数是m = 255,一个是n = 75,找他们两的最大公约数
算法思想
用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止,最后的除数就是这两个数的最大公约数
可能看起来有点绕,实际操作看看
m | n | m%n(余数) |
---|---|---|
255 | 75 | 30 |
75 | 30 | 15 |
30 | 15 | 0 |
所以得到结果他们的最大公约数是15
用C语言实现
#include<stdio.h>
int gcd(int m, int n) {
int temp;
while(n) {
temp = m%n;
m = n;
n = temp;
}
return m;
}
int main() {
printf("%d\n", gcd(255, 75));
}
循环的过程中多了一步,检查到n = 0时,返回m
m | n | m%n(余数) |
---|---|---|
255 | 75 | 30 |
75 | 30 | 15 |
30 | 15 | 0 |
15 | 0 |