欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
輾轉相除法求最大公約數/最小公倍數

http://blog.csdn.net/jtujtujtu/article/details/4407171

2009


參考:http://zhidao.baidu.com/question/50322580.html

 

輾轉相除法求最大公約數:

 

輾轉相除法, 又名歐幾里德算法(Euclidean algorithm)乃求兩個(gè)正整數之最大公因子的算法。它是已知最古老的算法, 其可追溯至前300年。它首次出現于歐幾里德的《幾何原本》(第VII卷,命題i和ii)中,而在中國則可以追溯至東漢出現的《九章算術(shù)》。它并不需要把二數作質(zhì)因子分解。


證明:
設兩數為a、b(b<a),求它們最大公約數gcd(a、b)的步驟如下:用b除a,得a=bq1+r1(0≤r1<b)。若r1=0,則gcd(a,b)=b;若r1≠0,則再用r1除b,得b=r1q2+r2(0≤r2<r1)。若r2=0,則gcd(a,b)=r1,若r2≠0,則繼續用r2除r1,……如此下去,直到能整除為止。其最后一個(gè)非零余數即為gcd(a,b)。

 

算法:
輾轉相除法是利用以下性質(zhì)來(lái)確定兩個(gè)正整數 a 和 b 的最大公因子的:

   1. 若 r 是 a ÷ b 的余數, 則

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

   2. a 和其倍數之最大公因子為 a。

另一種寫(xiě)法是:

   1. a ÷ b,令r為所得余數(0≤r<b)

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

   2. 互換:置 a←b,b←r,并返回第一步。

c/c++ 代碼:

遞歸法:

[c-sharp] view plain copy
  1. int gcd(int a, int b)  //(a>b)  
  2. {  
  3.     if(a==0 || b==0)  
  4.         return 0;  
  5.     int t=a%b;  
  6.     if(t==0)  
  7.         return b;  
  8.     return gcd(b, t);  
  9. }  

 

循環(huán)法:

[c-sharp] view plain copy
  1. int gcd(int a, int b) //a>b  
  2. {  
  3.     if(a==0 || b==0)  
  4.         return 0;  
  5.     while(b!=0)  
  6.     {  
  7.         int t=a%b;  
  8.         a=b;  
  9.         b=t;  
  10.     }  
  11.     return a;  
  12. }  

 

另:考慮大數時(shí),需要分析可行性,由此得到一些簡(jiǎn)化方法,譬如:

 

x, y均為偶數,fx, y)= 2 * fx/2, y/2)= 2 * fx>>1, y>>1)

x為偶數,y為奇數,fx, y)= fx/2, y)= fx>>1, y

x為奇數,y為偶數,fx, y)= fx, y/2)= fx, y>>1)

x, y均為奇數,fx, y)= fx, xy),

那么在fx, y)= fx, xy)之后,(xy)是一個(gè)偶數,下一步一定會(huì )有除以2的操作。

因此,最壞情況下的時(shí)間復雜度是O(log2(max(x, y))。

考慮如下的情況:

       f(42, 30)= f(1010102, 111102

                       = 2 * f(101012, 11112

                       = 2 * f(11112, 1102

                       = 2 * f(11112, 112

                       = 2 * f(11002, 112

                       = 2 * f(112, 112

                       = 2 * f(02, 112

                       = 2 * 112

                       = 6

根據上面的規律,具體代碼實(shí)現如下:

 

 

代碼清單2-16

 

 

BigInt gcd(BigInt x, BigInt y)

{

    if(x < y)

        return gcd(y, x);

    if(y == 0)

        return x;

    else

    {

        if(IsEven(x))

        {

            if(IsEven(y))

                return (gcd(x >> 1, y >> 1) << 1);

            else

                return gcd(x >> 1, y);

        }

        else

        {

            if(IsEven(y))

                return gcd(x, y >> 1);

            else

                return gcd(y, x - y);

        }

    }

}

 

有了最大公約數,最小公倍數則很簡(jiǎn)單了,a*b/gcd(a,b).

 

如有任何看法,歡迎交流:)

mosesyuan at gmail.com

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
小灰算法(二): 可能是小學(xué)老師沒(méi)教你的最大公約數算法
最大公約數和最小公倍數的算法
靈感編程:最大公約數算法解析
漫畫(huà)算法:輾轉相除法是什么鬼?
從零開(kāi)始:Python教程之最大公約數求解
最大公約數(Gcd)兩種算法(Euclid && Stein) [整理]
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久