求N个数的最小公倍数

题目描述

求n(n <= 50)个数的最小公倍数。

输入

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

输出

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

样例输入

2 4 6
3 2 5 7

样例输出

12
70

在数学上,我们求几个数的最小公倍数的方法是对他们分解质因数,然后将他们的质因数相乘,如果有相同的质因数则乘的时候乘该共有质因数的最高次幂项,这种方法显然不适合写程序解题,我们考虑另一种方法。公式法,有这样一个公式:x*y = gcd *lcm,即是x y为要求最小公倍数的两个数,lcm代表最小公倍数,gcd代表最大公约数。将公式变形可得lcm = x*y/gcd,我们就可以利用这个公式求lcm。

求gcd的方法很多,可以手写一个函数gcd()利用辗转相除法求,由于这里是解题,我们可以直接使用G++编译器自带的 __gcd(int,int)函数来求,返回值即是这两个数的最大公约数,使用时需要包含头文件#include,这是c++的头文件,另外,这个函数在devc++里可用,code::blocks应该也可用,但是vs里是用不了这个函数的,请自行实现一个。

那么我们理一下写程序的思路,首先我们要用一个数组储存要求的几个数,然后写个函数循环求gcd,这里我曾犯了一个错,我把求lcm和gcd的过程分开了,就是先对这n个数求lcm,然后统一求gcd,这是错误的。正确的做法是,假如传进来n个数a b c d e....,我们应该先对a b求lcm然后求a b的gcd,再用这个结果(a b的gcd)和c一起求gcd,再用结果和d一起求gcd,以此类推。如果担心溢出问题可以将公式调整一下求值顺序,lcm = x/gcd*y,对这题而言多此一举,题目已经说明结果为32位整数。

下面是我的题解代码:

#include 
#include 

using namespace std;

int main(){

	int n,a;
	while(scanf("%d",&n) != EOF){
		int arr[n];
		for(int i=0;i

这份代码提交OJ已AC。

你可能感兴趣的:(算法相关)