ACM杭电的AC回顾——2028

惯例先上题目,后上解析,最后上自己的代码

题目

Lowest Common Multiple Plus

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 47706 Accepted Submission(s): 19782

Problem Description
求n个数的最小公倍数。

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

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

Sample Input
2 4 6
3 2 5 7

Sample Output
12
70

题目解析
个人认为,这道题真的挺好玩,具体好玩在哪呢,因为他花费了脑子去想他的解法!
这道题求得是n个数的最小公倍数,要最小的话可以直接列举出一系列的数去除以每个数字,直到找到最小的并且可以全部除尽的数,我们可以选择第一个数的倍数作为这一系列的数,之后用一个循环重复对其他数求余,如果发现有余数,说明那就是除不尽,那就要让这个数增一倍,用下一个数在去做同样事。
可是再循环里面怎么让他再次这么做呢?重点来了,以前我们做for循环有没有遇到再修改变量的时候不小心把循环用的那个变量改掉的情况呢?(反正我是做过这个蠢事)这里我们就是要这么做,因为这么做可以让我们的循环重新开始,只要我们把那个变量修改到最初始的值,就可以让这个循环重头做起~
不过这里要注意,for循环是在执行完内部语句后,最后执行那个对变量操作的语句,所以值要改的比起始值小一

/********************
求n个数的最小公倍数。
**********************/

#include
void main()
{
    int a[200],n,i;
    int m;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
        m=a[1];
        for(i=2;i<=n;i++)
        {
            if(a[1]%a[i]!=0)
            {
                a[1]=a[1]+m;
                i=1;
            }
        }
        printf("%d\n",a[1]);
    }
}

最后祝大家AC愉快哦:)

你可能感兴趣的:(ACM)