【最大公约数】
辗转相除法:
假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,在计算机中求余是这样进行的:
1997 %615 = 152
615 %152 = 7
152 %7 = 5
7% 5 = 2
5 % 2 = 1
2 % 1 = 0
至此,最大公约数为1
用较大的数除以较小的数求余,再用该余数作为新的除数,原来的较小数作为新的被除数再次求余(仍然是较大数除以较小数,可用于设变量的根据),多次循环,直到最后求余等于零。
在了解到计算方法之后,我按照和数学计算思路贴近的方式来处理,包括判断大小:
// u5 3. by Lystie
#include<stdio.h>
int main(){
int m, n, max, min, t;
printf("Enter m,n=");
scanf("%d,%d", &m, &n);
//Judge
if (m > n){
max = m;
min = n;
}
else{
max = n;
min = m;
}
//最大公约数
while (min != 0){
t = min;
min = max % min;
max = t;
}
printf("最大公约数:%d\n", t);
return 0;
}
在研究其它代码思路之后,我发现许多代码在计算最大公约数时并没有判断大小这一步,我通过反例思考判断是否必要:
如果n=3,m=2,n>m
而第一次循环按照m%n计算:
2%3=2(2除以3等于0,余数为2)
所以新的除数min=2
被除数是原式子里作为除数的n
第二次循环:
n%min=3%2
实际上就变成了n%m(数学上正确的较大数除以较小数),对循环结果无影响
因此代码可以简化成无需判断的形式,而为了使程序易懂脑子不晕、为了计算最小公倍数用原m、n时不出错,还是用max和min来临时存放mn的数值
// u5 3.2.0 by Lystie
#include<stdio.h>
int main(){
int m, n, t, max, min;
printf("Enter m,n=");
scanf("%d,%d", &m, &n);
//最大公约数
max = m;
min = n;
while (min != 0){
t = min;
min = max % min;
max = t;
}
printf("最大公约数:%d\n", t);
return 0;
}
【最小公倍数】
两数乘积=最大公约数*最小公倍数
算出最大公约数之后很容易求得
//最小公倍数
printf("最小公倍数:%d\n", m*n/t);