求两个数的最大公约数和最小公倍数

 

/************************************************************
 *    FileName:    gcd-lcm.cpp
 *    Description: 求得两个数的最大公约数和最小公倍数    
 *    Author:      Cui Xiaofeng
 *    Date:         2008/3/15
 *    Version:     1.0
 ************************************************************
*/

#include 
< cstdio >
#include 
< iostream >
#include 
< cassert >
using   namespace  std;

class  GcdLcm
{
public:
    GcdLcm(unsigned 
long a, unsigned long b);
    unsigned 
long GcdNotRecur();
    unsigned 
long GcdRecur();
    unsigned 
long Lcm();
private:
    unsigned 
long firstValue;
    unsigned 
long secondValue;
    unsigned 
long GcdRecurPrivate(unsigned long a , unsigned long b);
}
;

GcdLcm::GcdLcm(unsigned 
long  a, unsigned  long  b):firstValue(a), secondValue(b)
{

}


unsigned 
long  GcdLcm::GcdNotRecur()
{
    unsigned 
long c;
    
/* copy the value, or they will be modified */
    unsigned 
long a = firstValue;
    unsigned 
long b = secondValue;
    
while ((a % b) != 0)
    
{
        c 
= a % b;
        a 
= b;
        b 
= c;
    }

    
return b;
}


unsigned 
long  GcdLcm::GcdRecur()
{
    
return GcdRecurPrivate(firstValue, secondValue);
}


unsigned 
long  GcdLcm::Lcm()
{
    
return (firstValue * secondValue) / GcdNotRecur();
}


/* private function invoked by GcdRecur */
unsigned 
long  GcdLcm::GcdRecurPrivate(unsigned  long  a, unsigned  long  b)
{
    
if (0 == b)
    
{
        
return a;
    }

    
else 
    
{
        
return GcdRecurPrivate(b, a % b);
    }

}


/* test function */
int  main()
{
    GcdLcm test(
2456);
    cout 
<< test.GcdRecur() << endl;
    cout 
<< test.GcdNotRecur() << endl;
    cout 
<< test.Lcm() << endl;

    
return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值