作为初学者,大家可能都被这道题为难过 小乐乐与欧几里得_牛客题霸_牛客网
今天我来分享两种求最大公约数的方法,附带介绍求最小公倍数的方法
方法一:辗转相除法
第一步:找出两数中较大数作为被除数,两数相除,得到余数
第二步:除数和余数一定是除数大,两数中较大数作为被除数,相除,得到余数
第三步:余数为0时,除数即为两数最大公约数
int main() {
long n = 0, m = 0, remainder = 0, max = 0, min = 0; //使用long类型变量,避免数据溢出
scanf("%ld%ld", &n, &m);
//定义两个变量来存放m,n的值,并进行大小判断;
//因为后续求最小公倍数还需用到初始的m,n值,所以不可直接改变其初始值
max = m >= n ? m : n;
min = m < n ? m : n;
//辗转相除法
while (max % min)//余数为0时循环结束,最大公约数为min
{
remainder = max % min;
max = min; //余数一定小于除数,所以不用判断remainder和min大小
min = remainder;
}
printf("%ld", min + m * n / min); //最大公约数*最小公倍数 = m*n;
return 0;
}
方法二:更相减损法
第一步:找出两数中较大值作为被减数,两数相减,得差值
第二步:判断减数和差值大小,两数中较大值作为被减数,两数相减,得差值
第三步:当减数和差值相等时,等值即为最大公约数
int main() {
long long n = 0, m = 0, i = 1, max = 0, min = 0; //使用long long类型变量,不然数据会溢出
scanf("%lld%lld", &n, &m);
//定义两个变量存储m,n并对大小进行判断
max = m >= n ? m : n;
min = m < n ? m : n;
//两数均为偶数时,对数据进行预处理,减少计算量
while (max % 2 == 0 && min % 2 == 0) {
max /= 2;
min /= 2;
i *= 2;
}
while (max != min) //减数等于差时循环结束,减数即为最大公约数
{
if (max > min)
max -= min; //把差赋值给max,返回循环判断
else
min -= max; //把差赋值给min,返回循环判断
}
long long num1 = i * max; //定义变量num1 用来存放最大公约数
long long num2 = m * n / num1; //定义变量num2 用来存放最小公倍数
printf("%lld", num1 + num2);
return 0;
}
希望能为大家提供一些思路和帮助,欢迎交流指正。