| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5960 人关注过本帖
标题:关于n个数的最小公倍数
只看楼主 加入收藏
aing321
Rank: 2
等 级:论坛游民
帖 子:31
专家分:23
注 册:2013-1-30
结帖率:100%
收藏
已结贴  问题点数:15 回复次数:6 
关于n个数的最小公倍数
程序代码:
#include<stdio.h>
#include<malloc.h>
int hanshu(int a,int b){
    int c,d,e;
    d=a;e=b;
    while(b!=0){
        c=a%b;
        a=b;
        b=c;
    }
    return d*e/a;
}
int main(){
    int n,*a,i,d;
    while(scanf("%d",&n)!=EOF){
        a=(int *)malloc(sizeof(int) *n);
        for(i=0;i<n;i++)
            scanf("%d",a+i);
        d=hanshu(a[0],a[1]);
        if(n>2)
            for(i=2;i<n;i++)
                d=hanshu(d,a[i]);
            printf("%d\n",d);
    }
    return 0;
}



我的思路是首先为n个数开辟空间,弄成数组,然后就是两个对比完用结果与接下来的数进行对比
结果vc上运行可以得到想要的结果,但oj上是Wrong Answer
搜索更多相关主题的帖子: 最小公倍数 
2013-02-02 12:26
心灯甚亮
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:441
专家分:996
注 册:2013-1-29
收藏
得分:2 
我没看原题 不过acm的题通常先输入测试的数据组数 然后连续输入数据 最后要求输出结果的 建议再看看题目
2013-02-02 12:40
tompobing
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:260
专家分:809
注 册:2012-12-9
收藏
得分:3 
我觉得这句while(scanf("%d",&n)!=EOF有问题,我改了一下你看行不行


#include<stdio.h>
 #include<malloc.h>
 int hanshu(int a,int b){
     int c,d,e;
     d=a;e=b;
     while(b!=0){
         c=a%b;
         a=b;
         b=c;
     }
     return d*e/a;
 }
 int main(){
     int n,*a,i,d;
        scanf("%d",&n);
         a=(int *)malloc(sizeof(int) *n);
         for(i=0;i<n;i++)
             scanf("%d",a+i);
         d=hanshu(a[0],a[1]);
         if(n>2)
             for(i=2;i<n;i++)
                 d=hanshu(d,a[i]);
             printf("%d\n",d);
     
     return 0;
 }
2013-02-02 14:32
aing321
Rank: 2
等 级:论坛游民
帖 子:31
专家分:23
注 册:2013-1-30
收藏
得分:0 
回复 3楼 tompobing
题目有要求要有多组数据
删掉while(scanf("%d",&n)!=EOF)之后就只能执行一组数据

天行健君子以自强不息 地势坤君子以厚德载物
2013-02-02 18:57
tompobing
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:260
专家分:809
注 册:2012-12-9
收藏
得分:0 
#include<stdio.h>
 #include<malloc.h>
 int hanshu(int a,int b){
      int c,d,e;
      d=a;e=b;
      while(b!=0){
          c=a%b;
          a=b;
          b=c;
      }
      return d*e/a;
 }
 int main(){
      int n,*a,i,d,m;
      scanf("%d",&m);
      for(int j=0;j<m;j++)
      {
         scanf("%d",&n);
          a=(int *)malloc(sizeof(int) *n);
          for(i=0;i<n;i++)
              scanf("%d",a+i);
          d=hanshu(a[0],a[1]);
          if(n>2)
              for(i=2;i<n;i++)
                  d=hanshu(d,a[i]);
              printf("%d\n",d);
      }
      
      return 0;
 }



这样应该可以了吧,先输入有m组数据,(然后输入有n个数,在输入n个数字求他们的最小公倍数)括号里循环m次,就是m组数据
2013-02-03 02:29
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:10 
唉,小友导致结果不对的原因有很多,别只盯着一处不放。

一个老毛病怎么就记不住呢?释放空间。

而你的主要问题其实是计算溢出了。不管是玩ACM还是项目实战中,在编码前一定要将需求分析清楚,其中包括你要计算的元素的性质、取值范围。

题目中肯定会描述结果的取值范围,根据这个范围来确定变量类型。

首先,你再确认一次32位整型能否表达结果;

第二,计算顺序对结果的准确性及准确范围的影响不容忽视,本质上它决定了误差引入的时机,引入越早对结果的影响越大。在你的问题里,将hanshu返回的表达式改为d/a*e;

建议你做个试验,对比一下d*e/a与d/a*e在求1百万和2百万的最小公倍数时的结果,然后自己好好分析一下原因。

最后,给点个人建议。ACM锻炼的是算法的分析实现技巧,前提条件是语言基础要扎实。小友在这方面还要多下点力气,磨刀不误砍柴功。

重剑无锋,大巧不工
2013-02-03 09:43
aing321
Rank: 2
等 级:论坛游民
帖 子:31
专家分:23
注 册:2013-1-30
收藏
得分:0 
回复 6楼 beyondyf
谢谢大神   
用d*e/a是不是会在计算d*e的过程中溢出  然后导致错误
至于空间释放。。。    经常忘了还有这个步骤

天行健君子以自强不息 地势坤君子以厚德载物
2013-02-03 10:03
快速回复:关于n个数的最小公倍数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019103 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved