杭电oj编码2028

问题描述:

求n个数的最小公倍数。


输入:

输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数。


输出:

为每组测试数据输出它们的最小公倍数,每个测试实例的输出占一行。你可以假设最后的输出是一个32位的整数。


样例输入:

2 4 6

3 2 5 7


样例输出:

12

70


分析:

本题的问题十分直接,就是求最小公倍数。但是数涉及到了几个问题:

1、当输入的数较大时,结果会不会超出范围。---------题目说明:输出结果是一个32位的整数,所以,这个问题就不用考虑了。

2、涉及到这种问题,必定会有一个求最大公约数的方法,这个方法是什么。-------欧几里得算法,也就是说辗转相除法,这种算法是求最大公约数,但是最大公约数和最小公约数之间又存在一定的关系。

例如:两个整数num1和num2,求它们之间的最小公倍数,可以利用欧几里得算法(百度百科中讲解得很详细),先求出他们的最大公约数GCD,然后,最小公倍数=num*num2/GCD。即可求出。

3、注意,此处需要自己输入需要求最小公倍数的数据。所以,此题是对多个数据求最小公倍数的操作,所以,必须要了解做法:将前两个数的最大公约数和后一个数再次求最大公约数即可。这个操作可以用一个循环控制。

综上所述:本题需要一个嵌套循环即可完成操作。外层循环用于循环测试多组实例,内层循环用于对每两个数求最小公倍数。


代码:

#include
#include
int GCD(int num1, int num2)//欧几里得算法
{
	return num2 ? GCD(num2, num1%num2) : num1;
}
int main()
{
	int n;
	while (~scanf("%d", &n))//用于测试多组实例
	{
		int num1, num2;//用于存放每次循环中做辗转相除法的两个数
		scanf("%d", &num1);
		for (int i = 1; i < n; ++i)
		{
			scanf("%d", &num2);//num2是每次新加入的数
			num1 *= num2 / GCD(num1, num2);//num1是前面所有的数的最小公倍数
		}
		printf("%d\n", num1);
	}
	return 0;
}

你可能感兴趣的:(HDU水题)