zoukankan      html  css  js  c++  java
  • 【C/C++】计算两个整数的最大公约数和最小公倍数

    算法一

    任何>1的整数都可以写成一个或多个素数因子乘积的形式,且素数乘积因子以非递减序出现。

    则整数x,y可以分别标记为:
    x=p1x1p2x2...pmxm

    y=p1y1p2y2...pmym

    (其中p1,p2,....是素数,若有必要素数因子的指数xj或yj可以为0)

    (1)最大公约数 gcd(x,y)=p1min(x1,y1)p2min(x2,y2)...pmmin(xm,ym)

    (2)最小公倍数 lcm(x,y)=p1max(x1,y1)p2max(x2,y2)...pmmax(xm,ym)

    (3)因此,亦可得:lcm(x,y)*gcd(x,y)=x*y

    按如上思路计算gcd(x,y)至少需要如下两步

    step1: decompose_to_primes(int n);//把整数n分解成素数相乘的形式

    step2:get_gcd(int x,int y);//根据step1的结果按照公式(1)计算gcd(x,y)

    分明显计算量比较大。

    实际上从编程的角度来看,在x,y的数值不是很大的情况下。若是单纯的计算最大公约数和最小公倍数可以不必这么复杂,可以从大到小遍历min(x,y)的约数,找到的第一个公约数即为所求。

     1 int get_gcd(int x,int y)
     2 {
     3     int temp;
     4     int i;
     5     if(x>y)
     6     {
     7         temp=x;
     8         x=y;
     9         y=temp;
    10     }
    11     if(y%x==0)
    12         return x;
    13     for(i=x/2;i>1;i--)
    14         if(x%i==0)
    15             if(y%i==0)
    16                 return i;    
    17     return 1;
    18 }
    19 
    20 int get_lcm(int x,int y)
    21 {
    22  return (x*y)/(get_gcd(x,y));
    23 }

    算法二

    用Euclid算法(即辗转相除法)

    step1、令r为a/b所得余数(0≤r<b)。若 r= 0,算法结束,则b 即为所求,否则执行step2。

    step2、a←b,b←r,重新执行step1。
     1 int gcd(int x,int y)//Euclid method
     2 {
     3     int r;
     4     if(x<y)
     5     {
     6         r=x;
     7         x=y;
     8         y=r;
     9     }
    10     r=x%y;
    11     while(r)
    12     {
    13         x=y;
    14         y=r;
    15         r=x%y;
    16     }
    17         return y;
    18 }
  • 相关阅读:
    ADO.NET存取数据库数据
    2017-01-03
    re模块
    random模块(随机)
    sys模块
    os模块
    datetime模块
    time模块
    logging模块
    Python函数初识
  • 原文地址:https://www.cnblogs.com/wxiaoli/p/5335419.html
Copyright © 2011-2022 走看看