求最大公约数与最小公倍数

#include <stdio.h>

//
// 最大公约数(Greatest Common Divisor)
// 辗转相除法:
//  分别用m, n, r表示被除数, 除数, 余数.
//  ①求m/n的余数r。
//  ②若r=0, 则n为最大公约数. 若r≠0, 执行第③步.
//  ③将n的值放在m中, 将r的值放在n中.
//  ④返回重新执行第①步。
//
unsigned long Gcd(unsigned long m, unsigned long n)
{
   unsigned long temp;

   while (n)
   {
      temp = n;
      n = m % n;
      m = temp;
   }
   return m;

   //
   // 还有一种递归的算法:
   //   if (m == 0)
   //   {
   //      return n;
   //   }
   //   return Gcd(n%m, m);
   //
}


//
// 最小公倍数(Lease Common Multiple)
//
unsigned long Lcm(unsigned long m, unsigned long n)
{
   return m / Gcd(m, n) * n;

   //
   // 另外一种方法是:
   //  unsigned long a;
   //  for (a = 1; a <= m*n; a++)
   //  {
   //     if ((a%m == 0) && (a%n == 0))
   //     {
   //        break; // 这里该结束了,找到了最小公倍数。
   //     }
   //  }
   //  return a;
   //
}


void main()
{
   unsigned long m, n, a;

   printf("输入两个数(用空格分隔):");
   scanf("%lu%lu", &m, &n);
   if ((m < 0) || (n < 0))
   {
      return;
   }

   a = Lcm(m, n);
   printf("%lu和%lu的最小公倍数是%lu/n", m, n, a);

   a = Gcd(m, n);
   printf("%lu和%lu的最大公约数是%lu/n", m, n, a);

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值