• C语言求最大公约数和最小公倍数


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

    假设有两个数a和b,求a,b的最大公约数和最小公倍数实际上是一个问题,得出这两个数的最大公约数就可以算出它们的最小公倍数。

    最小公倍数的公式是 a*b/m

    m为最大公约数

    因为

    a=m*i; b=m*j;

    最小公倍数为 m*i*j

    那么,下面就开始计算a和b的最大公约数。

    更相损减法:

    《九章算術·方田》作分數約簡時,提到求最大公因數方法:反覆把兩數的較大者減去較小者,直至兩數相等,這數就是最大公因數。這方法除了把除法換作減法外,與輾轉相除法完全相同。例如書中求91和49的最大公因數:

    1. 91 > 49, 91 - 49 = 42
    2. 49 > 42, 49 - 42 = 7
    3. 42 > 7, 42 - 7 = 35
    4. 35 > 7, 35 - 7 = 28
    5. 28 > 7, 28 - 7 = 21
    6. 21 > 7, 21 - 7 = 14
    7. 14 > 7, 14 - 7 = 7
    8. 7 = 7, 因此91和49的最大公因數是7

    辗转相除法:

    輾轉相除法是利用以下性質來確定兩個正整數 ab 的最大公因數的:

    1. ra ÷ b 的餘數, 則

    gcd(a,b) = gcd(b,r)

    1. a 和其倍數之最大公因數為 a

    另一種寫法是:

    1. a ÷ b,令r為所得餘數(0≤rb

    r = 0,演算法結束;b 即為答案。

    1. 互換:置 abbr,並返回第一步。

    这个算法可以用递归写成如下:

      function gcd(a, b) {

      if a mod b<>0

      return gcd(b, a mod b);

      else

      return a;

      }

      或纯使用循环:

      function gcd(a, b) {

      define r as integer;

      while b ≠ 0 {

      r := a mod b;

      a := b;

      b := r;

      }

      return a

      }

      其中“a mod b”是指取 a ÷ b 的余数。

    C语言:

    #include <stdio.h>



    int gcd(int a,int b)//最大公约数

    {

    if (a<b) return gcd(b,a);

    else if (b==0) return a;

    else return gcd(b,a%b);

    }



    int lcm(int a,int b)

    {

    return a*b/gcd(a,b);

    }



    main()

    {

    int a,b;

    scanf("%d%d",&a,&b);

    printf("最大公约数:%d ",gcd(a,b));

    printf("最小公倍数:%d ",lcm(a,b));

    }


     

    输入两个正整数m和n, 求其最大公约数和最小公倍数. <1> 用辗转相除法求最大公约数 算法描述: m对n求余为a, 若a不等于0 则 m <- n, n <- a, 继续求余 否则 n 为最大公约数 <2> 最小公倍数 = 两个数的积 / 最大公约数
    #include int main()
    {
    int m, n; int m_cup, n_cup, res;
    printf("Enter two integer: ");
    scanf("%d %d", &m, &n);
    if (m > 0 && n >0)
      {
        m_cup = m;
        n_cup = n;
        res = m_cup % n_cup;
        while (res != 0)
         {
           m_cup = n_cup;
           n_cup = res;
           res = m_cup % n_cup;
         }
         printf("Greatest common divisor: %d ", n_cup);
         printf("Lease common multiple : %d ", m * n / n_cup);
       }
      else printf("Error! ");
      return 0;
    }
    ★ 关于辗转相除法, 搜了一下, 在我国古代的《九章算术》中就有记载,现摘录如下: 约分术曰:“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。” 其中所说的“等数”,就是最大公约数。求“等数”的办法是“更相减损”法,实际上就是辗转相除法。辗转相除法求最大公约数,是一种比较好的方法,比较快。对于52317和75569两个数,你能迅速地求出它们的最大公约数吗?一般来说你会找一找公共的使因子,这题可麻烦了,不好找,质因子大。现在教你用辗转相除法来求最大公约数。先用较大的75569除以52317,得商1,余数23252,再以52317除以23252,得商2,余数是5813,再用23252做被除数,5813做除数,正好除尽得商数4。这样5813就是75569和52317的最大公约数。你要是用分解使因数的办法,肯定找不到。那么,这辗转相除法为什么能得到最大公约数呢?下面我就给大伙谈谈。比如说有要求a、b两个整数的最大公约数,a>b,那么我们先用a除以b,得到商8,余数r1:a÷b=q1…r1我们当然也可以把上面这个式子改写成乘法式:a=bq1+r1------l)如果r1=0,那么b就是a、b的最大公约数3。要是r1≠0,就继续除,用b除以r1,我们也可以有和上面一样的式子: b=r1q2+r2-------2)如果余数r2=0,那么r1就是所求的最大公约数3。为什么呢?因为如果2)式变成了b=r1q2,那么b1r1的公约数就一定是a1b的公约数。这是因为一个数能同时除尽b和r1,那么由l)式,就一定能整除a,从而也是a1b的公约数。反过来,如果一个数d,能同时整除a1b,那么由1)式,也一定能整除r1,从而也有d是b1r1的公约数。这样,a和b的公约数与b和r1的公约数完全一样,那么这两对的最大公约数也一定相同。那b1r1的最大公约数,在r1=0时,不就是r1吗?所以a和b的最大公约数也是r1了。有人会说,那r2不等于0怎么办?那当然是继续往下做,用r1除以r2,……直到余数为零为止。在这种方法里,先做除数的,后一步就成了被除数,这就是辗转相除法名字的来历吧。

  • 相关阅读:
    Leetcode NO.110 Balanced Binary Tree 平衡二叉树
    Leetcode NO.226 Invert Binary Tree 翻转二叉树
    Leetcode NO.215 Kth Largest Element In An Array 数组中的第K个最大元素
    根据特征的浏览器判断
    Cygwin在打开在当前目录
    【转帖】科学对待 健康养猫 打造快乐孕妇
    解决chrome浏览器安装扩展、应用程序一直处在“检查中”的问题
    对【SQL SERVER 分布式事务解决方案】的心得补充
    关于“点击这里继续访问您选择的百度XXX”
    VBA一例:如何保持文本框焦点
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/3796313.html
Copyright © 2020-2023  润新知