HDU 1019.Least Common Multiple【多个数的最小公倍数】【自己的算法】【8月18】【8月19更新】

Least Common Multiple

Problem Description
The least common multiple (LCM) of a set of positive integers is the smallest positive integer which is divisible by all the numbers in the set. For example, the LCM of 5, 7 and 15 is 105.

 

Input
Input will consist of multiple problem instances. The first line of the input will contain a single integer indicating the number of problem instances. Each instance will consist of a single line of the form m n1 n2 n3 ... nm where m is the number of integers in the set and n1 ... nm are the integers. All integers will be positive and lie within the range of a 32-bit integer.
 

Output
For each problem instance, output a single line containing the corresponding LCM. All results will lie in the range of a 32-bit integer.
 

Sample Input
  
  
2 3 5 7 15 6 4 10296 936 1287 792 1
 

Sample Output
  
  
105 10296
求多个数的最小公倍数。我是这么求最小公倍数的:选取n个数中最大的为maxn,如果maxn能整除所有的数,则maxn就是这n个数的最小公倍数;如果不能整除,就看2倍的maxn能不能整除、3倍的能不能整除。。。。总之,最小公倍数肯定是最大数的整数倍。代码如下:

#include<cstdio>
int main(){
    int N;
    scanf("%d",&N);
    while(N--){
        int n,maxn=0,f[11000],x;
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            scanf("%d",&f[i]);
            if(f[i]>maxn) maxn=f[i];
        }
        x=maxn;
        bool flag=true;//能否全部整除
        for(int i=0;i<n;i++)
        if(maxn%f[i]!=0){//不能整除所有数
            flag=false;
            break;
        }
        while(!flag){
            maxn+=x;//maxn加一倍
            flag=true;//假设可以整除所有数
            for(int i=0;i<n;i++)
            if(maxn%f[i]!=0){//不能整除所有数
                flag=false;
                break;
            }
        }
        printf("%d\n",maxn);
    }
    return 0;
}


//

上面是之前的算法,效率很低,测试时间499MS,看我刚写的:求多个数的最小公倍数,就是不断求两个数的最小公倍数,不断更新最小公倍数。代码如下:

#include<cstdio>
int ans;
void qiu(int x,int y){//求x,y的最小公倍数
    int z=x;
    while(x%y!=0)
        x+=z;//还是用大的数翻倍来求最小公倍数
    ans=x;
}
int main(){
    int N,n;
    scanf("%d",&N);
    while(N--){
        ans=0;
        int f[10010];
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            scanf("%d",&f[i]);
            if(f[i]>ans) ans=f[i];//假设最大的那个数是最小公倍数
        }
        for(int i=0;i<n;i++)
            qiu(ans,f[i]);//不断求两个数的最小公倍数,然后更新ans
        printf("%d\n",ans);
    }
}

时间大大降低,效率提高,而且代码简练。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值