posts - 195, comments - 34, trackbacks - 0, articles - 1

          最大公約數(shù)和最小公倍數(shù)

          語(yǔ)言: C, 標(biāo)簽: 無(wú)  2008/07/22發(fā)布 5個(gè)月前更新 更新記錄
          作者: 半瓶墨水, 點(diǎn)擊5221次, 評(píng)論(0), 收藏者(0), , 打分:登錄以后才能打分, 目前平均0.0分,總分0, 共有0個(gè)用戶參與打分
          # 以下描述來自: http://baike.baidu.com/view/47637.htm
          #
          # 最大公約數(shù)(greatest common divisor,簡(jiǎn)寫為gcd;
          # 指某幾個(gè)整數(shù)共有公約數(shù)中的最大一個(gè)
          #  例: 在2、4、6中,2就是2,4,6的最大公約數(shù)。
          #
          # 重要性質(zhì):
          # gcd(a,b)=gcd(b,a) (交換律)
          # gcd(-a,b)=gcd(a,b)
          # gcd(a,a)=|a|
          # gcd(a,0)=|a|
          # gcd(a,1)=1
          # gcd(a,b)=gcd(b, a mod b)
          # gcd(a,b)=gcd(b, a-b)
          # 如果有附加的一個(gè)自然數(shù)m,
          # 則: gcd(ma,mb)=m * gcd(a,b) (分配率)
          # gcd(a+mb ,b)=gcd(a,b)
          # 如果m是a和b的最大公約數(shù),
          # 則: gcd(a/m ,b/m)=gcd(a,b)/m
          # 在乘法函數(shù)中有:
          # gcd(ab,m)=gcd(a,m) * gcd(b,m)
          # 兩個(gè)整數(shù)的最大公約數(shù)主要有兩種尋找方法:
          # * 兩數(shù)各分解質(zhì)因子,然后取出同樣有的項(xiàng)乘起來
          # * 輾轉(zhuǎn)相除法(擴(kuò)展版)
          # 和最小公倍數(shù)(lcm)的關(guān)系:
          # gcd(a, b) * lcm(a, b) = ab
          # a與b有最大公約數(shù),但不一定有最小公倍數(shù)。
          # 兩個(gè)整數(shù)的最大公因子可用于計(jì)算兩數(shù)的最小公倍數(shù),或分?jǐn)?shù)化簡(jiǎn)成最簡(jiǎn)分?jǐn)?shù)。
          # 兩個(gè)整數(shù)的最大公因子和最小公倍數(shù)中存在分配律:
          # * gcd(a, lcm(b, c)) = lcm(gcd(a, b), gcd(a, c))
          # * lcm(a, gcd(b, c)) = gcd(lcm(a, b), lcm(a, c))
          # 在坐標(biāo)里,將點(diǎn)(0, 0)和(a, b)連起來,通過整數(shù)坐標(biāo)的點(diǎn)的數(shù)目(除了(0, 0)一點(diǎn)之外)就是gcd(a, b)。
          #
          #
          # 以下代碼來自: http://bbs.bccn.net/thread-224663-1-1.html
          #
          int GCD(int a, int b)
          {
             if(b == 0) return a;
             else return GCD(b, a % b);
          }

          int LCM(int a, int b)
          {
             return a * b / GCD(a,b);
          }

          /*以下代碼來自:http://en.wikipedia.org/wiki/Binary_GCD_algorithm */
          unsigned int gcd(unsigned int u, unsigned int v)
          {
              int shift;

              /* GCD(0,x) := x */
              if (u == 0 || v == 0)
                  return u | v;

              /* Let shift := lg K, where K is the greatest power of 2
                 dividing both u and v. */
              for (shift = 0; ((u | v) & 1) == 0; ++shift) {
                  u >>= 1;
                  v >>= 1;
              }

              while ((u & 1) == 0)
                  u >>= 1;

              /* From here on, u is always odd. */
              do {
                  while ((v & 1) == 0/* Loop X */
                      v >>= 1;

                  /* Now u and v are both odd, so diff(u, v) is even.
                     Let u = min(u, v), v = diff(u, v)/2. */
                  if (u < v) {
                      v -= u;
                  } else {
                      unsigned int diff = u - v;
                      u = v;
                      v = diff;
                  }
                  v >>= 1;
              } while (v != 0);

              return u << shift;
          }


          主站蜘蛛池模板: 黔江区| 贺州市| 南宫市| 逊克县| 紫云| 泰兴市| 保定市| 宿州市| 沅陵县| 华坪县| 石嘴山市| 绍兴县| 石阡县| 越西县| 疏附县| 甘德县| 富蕴县| 临汾市| 长宁区| 平度市| 汝州市| 玉溪市| 彭山县| 昌宁县| 大冶市| 漯河市| 稷山县| 鄯善县| 贵溪市| 皋兰县| 无棣县| 兴城市| 剑川县| 突泉县| 汤阴县| 鲁甸县| 龙胜| 清河县| 富锦市| 阆中市| 普格县|