C语言易错题--求最大公约数与最小公倍数之和(辗转相除法)

题目来源:牛客网编程入门训练--BC115  小乐乐与欧几里得

输入描述:

每组输入包含两个正整数n和m。(1 ≤ n ≤ 109,1 ≤ m ≤ 109)

输出描述:

对于每组输入,输出一个正整数,为n和m的最大公约数与最小公倍数之和。

解题思路:此题有多种解题方法,列如分别求出两数的最大公约数与最小公倍数,再将其相加。(大致方法:取两数较小数为初识化的最大公约数,依次--,直到找到能同时将其整除的数字再停下,即为最大公约数;最小公倍数类似,取两数较大数为初始化的最小公倍数,依次++,直到找到一个能同时将两数除尽的数字,即为最小公倍数)。

这种算法思想由于运算量比较大,某些网站限制通过时间,所以这里我们用效率更优的辗转相除法求出最大公约数,再将两数的乘积除以最大公约数即为最小公倍数。 

下面上代码,需要注意的点在代码中以注释形式给出:

#include <stdio.h>
int main()
{
	long long m = 0; // 数字万一较大,用长长整型接收
	long long n = 0;
	scanf("%d %d", &m, &n);
	long long m1 = m;
	long long n1 = n; // 防止辗转相除过程中原数字改变,影响最小公倍数结果
	long long c = 0;
	while (c=m1%n1) //除尽的话n1即为最大公约数
	{
		m1 = n1;
		n1 = c;  
	}
	long long max = (m*n) / n1;// max为最小公倍数
	printf("%lld\n", max + n1);
	
	return 0;

}

C语言易错题--求最大公约数与最小公倍数之和(辗转相除法) 

 

over ~

上一篇:将一个数字划分成树状


下一篇:2021年N1叉车司机报名考试及N1叉车司机最新解析