Hdoj 2028 Lowest Common Multiple Plus

(这道题是借鉴了一些优秀的代码写出来的,做一下整理、学习记录)

求几个数的最小公倍数有多种方法,但并不是每一种方法都适合用于编程
这里举出一种方法:
若要求a, b, c, d 四个数的最小公倍数,可以先求a,b的最小公倍数,再求此公倍数与c的最小公倍数,即可获得a,b,c三数的最小公倍数,再求此数与d的最小公倍数,即可获得四个数的最小公倍数。
 
最小公倍数与最大公因数联系紧密。
两个数的乘积 = 两个数的最小公倍数 * 最大公因数
 
而最大公因数又可通过欧几里得算法GCD,也就是辗转相除法来求解。(辗转相除法好像是初中数学教的~)
大概思路是这样的(举一个栗子):
           688 ÷ 34 = 20 …… 8
           34 ÷ 8 = 4 …… 2
           8 ÷ 2 = 4 …… 0
当余数为零时可知688 34的最大公因数为2(大概就是辗转相除一直除到余数为零,就求得最大公因数)(有点递归的味道)
贴出辗转相除法的C++代码
int GCD(int a, int b){
    if(a%b==0)
        return b;
    else
        return GCD(b, a%b); 
}// 应注意调用时应满足 a>b 

下面是整道题的代码

#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
    int GCD(int, int);
    int n;
    while(scanf("%d",&n)!=EOF){ 
        int num[100];
	unsigned long minMul[100];//output中给出“最后输出的是32位的整数”,所以要用unsigned long,如果用其他类型会提示wrong answer
        for(int i=0; i<n; i++)
            cin >> num[i];
        minMul[0] = num[0]; // 借助另一个数组,将前面求出来的最小公倍数存起来,这样就能够用循环来处理多个数的问题
        for(int i=1; i<n; i++)
            if(minMul[i-1]<num[i])
                minMul[i] = minMul[i-1]*num[i]/GCD(num[i],minMul[i-1]);
            else
                minMul[i] = minMul[i-1]*num[i]/GCD(minMul[i-1],num[i]);//利用if来确保调用时大数在前,小数在后
        printf("%d\n", minMul[n-1]);
    }
}
int GCD(int a, int b){
    if(a%b==0)
        return b;
    else
        return GCD(b, a%b);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值