学习笔记--2028

  1. OJ 2028 Lowest Common Multiple Plus
    链(http://acm.hdu.edu.cn/showproblem.php?pid=2028)

问题描述:求n个数的最小公倍数。

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

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

2.思路:
一看到题的第一想法就是用一位数组把要求计算的数据装进去,然后再对它进行遍历穷举。框架很容易就写出来了,就是算法部分不知道怎么操作怎么进行遍历。因为这题不像普通的只求两个数的最小公倍数,而是变化的数据个数,那我们熟悉的两个数的辗转相除法、辗转相减法、穷举法都没有用了。由于算法经验不是很足,想了很久一直没有想到什么解决的办法。通过去讨论区观摩学习了大佬的思路后,成功把问题解决了。

3.收获与总结:

在一开始提交的时候出现了Compilation Error,是最开始弄框架的时候数组的定义上出了问题,贪图方便直接让数组大小让n取代。
image.png

后来想到了求最大公倍数时,是从i=1开始遍历的,而i可以取到n这个值(如果简单地循环for(i=0;i<n;i++)会因为i的最初值是0而影响到后面计算最小公倍数的结果)。但是数组的定义并不能取到num[n],会导致数组溢出,所以报错了。而直接定义实际范围给该数组。
image.png

通过学习,知道了另一种更好用的计算最小公倍数的算法。
除了去讨论区,后来再去看了一下别人的笔记,发现他顺利的实现了我一开始想的方法,也明白了灵活运用循环的重要性,他的办法是在原本两个数的穷举法基础上套了
个循环每次单独求两个数的最小公倍数,然后再用求到的最小公倍数跟后面的数继续比较,周而复始。
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.运行结果:


image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一.简述如何安装配置apache 的一个开源的hadoop 1.使用root账户登陆 2.修改ip 3.修改hos...
    栀子花_ef39阅读 4,986评论 0 52
  • 第一章数和数的运算 一概念 (一)整数 1整数的意义 自然数和0都是整数。 2自然数 我们在数物体的时候,用来表示...
    meychang阅读 2,656评论 0 5
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,418评论 0 2
  • 同窗三載,相識如初,離別在即,恨不能遠送,昔日情懷,誓必珍藏;期來日重逢之時,還與卿意,言語至此,珍重。
    冷秋静阅读 213评论 0 0
  • 爱。 暖而冷。 我望你时暖。 不见你时冷。 冬。 快到了。 白雪皑皑。 净着世界。 我。 在窗上呵出一口气。 用指...
    司才林阅读 329评论 4 14