Lowest Common Multiple Plus
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 26562 Accepted Submission(s): 10747
Problem Description
求n个数的最小公倍数。
Input
输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数。
Output
为每组测试数据输出它们的最小公倍数,每个测试实例的输出占一行。你可以假设最后的输出是一个32位的整数。
Sample Input
2 4 6 3 2 5 7
Sample Output
12 70
这道题计算n个数字的最小公倍数,我们可以从中选出最大的一个数,逐次加一,知道这个数处以所有n个数的余数都为零。
另外,也可以先用辗转相除法计算前两个数字的最小公倍数,再逐次加一~~
#include<iostream>
using namespace std;
int main(){
int n;
int a[100];
while(cin>>n){
int max=0;
for(int i=0;i<n;i++){
cin>>a[i];
if(a[i]>max)
max=a[i];
}
for(int j=max;;j++){
int cont=0;
for(i=0;i<n;i++){
if(j%a[i]!=0)
break;
cont++;
}
if(cont==n)
break;
}
cout<<j<<endl;
}
}
辗转除这种算法 还有个细节 就是第一个数让他和1求最小公倍数
第2个数和前面那个最小公倍数求最小公倍数 以此类推
#include<iostream>
using namespace std;
int gcd(int a,int b){
if(b==0)
return a;
else
return gcd(b,a%b);
}
int main(){
int n;
while(cin>>n){
int a,b=1;
for(int i=0;i<n;i++){
cin>>a;
b=b/gcd(a,b)*a;
}
cout<<b<<endl;
}
}
b/gcd(a,b)*a 和 (b*a)/gcd(a,b)
这两种情况 第一种可以AC 第二个不可以。可能是溢出的原因。(??)
最小公倍数和最大公约数链接: