(这道题是借鉴了一些优秀的代码写出来的,做一下整理、学习记录)
求几个数的最小公倍数有多种方法,但并不是每一种方法都适合用于编程
这里举出一种方法:
若要求a, b, c, d 四个数的最小公倍数,可以先求a,b的最小公倍数,再求此公倍数与c的最小公倍数,即可获得a,b,c三数的最小公倍数,再求此数与d的最小公倍数,即可获得四个数的最小公倍数。
最小公倍数与最大公因数联系紧密。
两个数的乘积 = 两个数的最小公倍数 * 最大公因数
而最大公因数又可通过欧几里得算法GCD,也就是辗转相除法来求解。(辗转相除法好像是初中数学教的~)
大概思路是这样的(举一个栗子):
688 ÷ 34 = 20 …… 8
34 ÷ 8 = 4 …… 2
8 ÷ 2 = 4 …… 0
当余数为零时可知688 34的最大公因数为2(大概就是辗转相除一直除到余数为零,就求得最大公因数)(有点递归的味道)
这里举出一种方法:
若要求a, b, c, d 四个数的最小公倍数,可以先求a,b的最小公倍数,再求此公倍数与c的最小公倍数,即可获得a,b,c三数的最小公倍数,再求此数与d的最小公倍数,即可获得四个数的最小公倍数。
最小公倍数与最大公因数联系紧密。
两个数的乘积 = 两个数的最小公倍数 * 最大公因数
而最大公因数又可通过欧几里得算法GCD,也就是辗转相除法来求解。(辗转相除法好像是初中数学教的~)
大概思路是这样的(举一个栗子):
688 ÷ 34 = 20 …… 8
34 ÷ 8 = 4 …… 2
8 ÷ 2 = 4 …… 0
当余数为零时可知688 34的最大公因数为2(大概就是辗转相除一直除到余数为零,就求得最大公因数)(有点递归的味道)
贴出辗转相除法的C++代码
int GCD(int a, int b){
if(a%b==0)
return b;
else
return GCD(b, a%b);
}// 应注意调用时应满足 a>b
下面是整道题的代码
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
int GCD(int, int);
int n;
while(scanf("%d",&n)!=EOF){
int num[100];
unsigned long minMul[100];//output中给出“最后输出的是32位的整数”,所以要用unsigned long,如果用其他类型会提示wrong answer
for(int i=0; i<n; i++)
cin >> num[i];
minMul[0] = num[0]; // 借助另一个数组,将前面求出来的最小公倍数存起来,这样就能够用循环来处理多个数的问题
for(int i=1; i<n; i++)
if(minMul[i-1]<num[i])
minMul[i] = minMul[i-1]*num[i]/GCD(num[i],minMul[i-1]);
else
minMul[i] = minMul[i-1]*num[i]/GCD(minMul[i-1],num[i]);//利用if来确保调用时大数在前,小数在后
printf("%d\n", minMul[n-1]);
}
}
int GCD(int a, int b){
if(a%b==0)
return b;
else
return GCD(b, a%b);
}