这道题目有下面几个难点: 1.存储的数字可能超出int上限 2.寻找最大公约数和最小公倍数可能会超时

解决方法: 1.对于超出上限,我们只需要使用long long类型就行。 2.对于超时问题,主要原因是数字太大,如果使用逐渐+1/-1进行判断,肯定会超时。所以要使用更快的算法,对于最大公约数,要使用欧几里得算法,最小公倍数要使用两数乘积=最大公约数和最小公倍数乘积的数学原理。对于欧几里得算法的原理,百度上有。

代码如下:

#define MAX(a,b) ((a > b)? (a) : (b))
#define MIN(a,b) ((a > b)? (b) : (a))

long long func1(long long a, long long b)
{
	if (a % b == 0)
		return b;
	else
		return func1(b, a % b);
}

int main()
{
	long long a = 0;
	long long b = 0;
	scanf("%lld %lld", &a, &b);
	long long result = func1(MAX(a, b), MIN(a, b));
	printf("%lld", result + a * b / result);
	return 0;
}