- OJ 2028 Lowest Common Multiple Plus
链(http://acm.hdu.edu.cn/showproblem.php?pid=2028)
问题描述:求n个数的最小公倍数。
Input:输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数。
Output:为每组测试数据输出它们的最小公倍数,每个测试实例的输出占一行。你可以假设最后的输出是一个32位的整数。
2.思路:
一看到题的第一想法就是用一位数组把要求计算的数据装进去,然后再对它进行遍历穷举。框架很容易就写出来了,就是算法部分不知道怎么操作怎么进行遍历。因为这题不像普通的只求两个数的最小公倍数,而是变化的数据个数,那我们熟悉的两个数的辗转相除法、辗转相减法、穷举法都没有用了。由于算法经验不是很足,想了很久一直没有想到什么解决的办法。通过去讨论区观摩学习了大佬的思路后,成功把问题解决了。
3.收获与总结:
后来想到了求最大公倍数时,是从i=1开始遍历的,而i可以取到n这个值(如果简单地循环for(i=0;i<n;i++)会因为i的最初值是0而影响到后面计算最小公倍数的结果)。但是数组的定义并不能取到num[n],会导致数组溢出,所以报错了。而直接定义实际范围给该数组。
通过学习,知道了另一种更好用的计算最小公倍数的算法。
除了去讨论区,后来再去看了一下别人的笔记,发现他顺利的实现了我一开始想的方法,也明白了灵活运用循环的重要性,他的办法是在原本两个数的穷举法基础上套了
个循环每次单独求两个数的最小公倍数,然后再用求到的最小公倍数跟后面的数继续比较,周而复始。
4.经过学习后的源代码:
#include<stdio.h>
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int a=0;
int num[100];
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
if(a<num[i])a=num[i];
}
for(int i=1;i<=n;i++){
if(a%num[i]!=0){
a++;
i=0;
}
}
printf("%d\n",a);
}
return 0;
}
5.运行结果: