zoukankan      html  css  js  c++  java
  • 求两个或N个数的最大公约数(gcd)和最小公倍数(lcm)的较优算法

    //两个数的最大公约数--欧几里得算法
    
    int gcd(int a, int b)
    
    {
    
         if (a < b)
    
              swap(a, b);
    
         if (b == 0)
    
               return a;
    
          else
    
                return gcd(b, a%b);
    
    }
    
    
    //n个数的最大公约数算法
    
    //说明: 
    
    //把n个数保存为一个数组
    
    //参数为数组的指针和数组的大小(需要计算的数的个数)
    
    //然后先求出gcd(a[0],a[1]), 然后将所求的gcd与数组的下一个元素作为gcd的参数继续求gcd
    
    //这样就产生一个递归的求ngcd的算法
    
     
    
    int ngcd(int *a, int n)
    
    {
    
        if (n == 1)  return *a;
    
        return gcd(a[n-1], ngcd(a, n-1));
    
    }
    
     
    //两个数的最小公倍数(lcm)算法
    
    //lcm(a, b) = a*b/gcd(a, b)
    
    int lcm(int a, int b)
    
    {
    
            return a*b/gcd(a, b);
    
    }
    
     
    
    //n个数的最小公倍数算法
    
    //算法过程和n个数的最大公约数求法类似
    
    //求出头两个的最小公倍数,再将欺和大三个数求最小公倍数直到数组末尾
    
    //这样产生一个递归的求nlcm的算法
    
    int nlcm(int *a, int n)
    
    {
    
          if (n == 1)
    
                return *a;
    
          else
    
                return lcm(a[n-1], nlcm(a, n-1));
    
    }
    
    
  • 相关阅读:
    QQ机器人
    Javascript实现base64的加密解密
    C# 对List<T>取交集、连集及差集
    简单正则验证
    中止线程
    线程同步synchronized
    volatile
    并发
    垃圾回收机制
    给定一个正整数num ,反复将各个位上的数字相加,直到结果为一位数
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2547785.html
Copyright © 2011-2022 走看看