日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > php教程 > 求解最大公約數(shù)和最小公倍數(shù)問題

求解最大公約數(shù)和最小公倍數(shù)問題

來源:程序員人生   發(fā)布時間:2015-04-17 08:34:24 閱讀次數(shù):5448次

思路:

最大公約數(shù)問題也是1個非常典型的遞歸算法的利用。每次遞歸使得原來求兩個大數(shù)之間的公約數(shù)轉(zhuǎn)變成求兩個略微小點的數(shù)之間的公約數(shù),要求轉(zhuǎn)換的進(jìn)程要保證不會改變公約數(shù)的值。這就要看其中轉(zhuǎn)換的原理了。

原理從《幾何本來》中得出--展轉(zhuǎn)相除。假定f(x, y) 表示x,y的最大公約數(shù)是g,而k = x/y,b= x%y,則g必能整出b。由于x = ky + b,b = x - ky,b/g = (x-ky)/g1定為整數(shù),所以必有g(shù)整除b。

以下所示:

f(42, 30) = f(30, 12) = f(12, 6)= f(6, 0) = 6

代碼以下:

[html] view plaincopy
  1. int gcd(int x , int y)  
  2. {  
  3.    return (y == 0 )?x :gcd(y , x % y) ;   
  4.       
  5. }  

非遞歸代碼:

int gcd(int x,int y) { int temp; while(y!=0) { temp=x; x=y; y=temp%y; } return x; }


書中還引申出展轉(zhuǎn)相減法,原理跟上面所述差不多。

代碼以下:

[html] view plaincopy
  1. int gcd(int x , int y)  
  2. {  
  3.    if(x < y)  
  4.     return  gcd(y , x) ;    
  5.    else if(y == 0)  
  6.     return x ;  
  7.    else  
  8.     return gcd(x - y , y) ;          
  9.       
  10. }   

非遞歸代碼:

int gcd(int n, int m) { if(n==0) return m; while (m!= 0) { if (n > m) n = n - m; else m = m - n; } return n; }
或:
int GetMaxCommonDivide_new(int n, int m) { if(n<m) { n^=m; m^=n; n^=m; //n=n+m; //m=n-m; //n=n-m; } while (m!= 0) { if (n > m) n = n - m; else m = m - n; } return n; }

最后書中提到1種相除和相減相結(jié)合的方法,保證了不做過量冗余的步驟。這就是把2當(dāng)作每次轉(zhuǎn)換的數(shù)量級。

若x,y均為偶數(shù),f(x,y) = 2*f(x/2,y/2) = 2*f(x>>1,y>>1)

若x為偶數(shù),y為奇數(shù),f(x,y) = f(x/2,y) = f(x>>1,y)

若x為奇數(shù),y為偶數(shù),f(x,y) = f(x,y/2) = f(x,y>>1)

若x,y均為奇數(shù),f(x,y) =f(y,x-y)

此解法結(jié)合了上述兩種方法:第1種方法遞歸次數(shù)相當(dāng)少但每次取模挺耗時(到底耗時情況如何,我沒有具體了解過,但肯定比加減法耗時些),而第2種遞歸可能會相當(dāng)多,但每次運(yùn)算都是減法運(yùn)算, 很快。綜合二者,用2為基數(shù),可以保證遞歸次數(shù)不那末多,同時運(yùn)算也快。

代碼以下:

[cpp] view plaincopy
  1. int gcd(int x , int y)  
  2. {  
  3.   if(x < y)  
  4.      return gcd(y , x) ;  
  5.   if(y == 0)  
  6.      return x ;  
  7.    if(isEven(x)) //x為奇  
  8.    {  
  9.      if(isEven(y)) //y為奇             
  10.         return gcd(x - y, y) ;           
  11.      else         //y為偶  
  12.         return gcd(x , y >>1) ;              
  13.    }      
  14.    else         //x為偶  
  15.    {  
  16.       if(isEven(y)) //y為奇數(shù)              
  17.         return gcd(x >> 1, y) ;           
  18.      else         //y為偶  
  19.         return 2 * gcd(x >> 1, y >> 1) ;        
  20.            
  21.    }  
  22.       
  23. }  

求解最小公倍數(shù):

從題面上看,好像我們需要求解的是兩個題目,但其實就是1個題目。那就是求最大公約數(shù)?為何呢?我們可以假想這兩個數(shù)m和n,假定m和n的最大公約數(shù)是a。那末我們可以這樣寫:

    m = b *a;

    n = c * a;

    所以m和n的最小公倍數(shù)就應(yīng)當(dāng)是a*b*c啊,那不就是m * n / a,其中m和n是已知的,而a就是那個需要求解的最大公約數(shù)。所以就有了下面的代碼,

[cpp] view plaincopy
  1. int GetMinCommonMultiple(int m, int n)  
  2. {  
  3.     assert(m && n);  
  4.   
  5.     return m * n / gcd(m, n);  
  6. }  



生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 精品欧美视频 | 国产精品久久久久久久7电影 | 激情五月婷婷综合 | 免费在线国产 | 日韩精品在线免费观看 | 国产三级在线 | jjzz日本 | 成年人视频在线免费观看 | 中字一区 | 91啪国 | 日本免费在线视频 | 午夜精品在线 | 不卡一区二区三区四区 | 看国产精品 | 欧美乱性 | 91n在线观看 | 91在线免费播放 | 国产精品久久久久久久免费大片 | 尤物av| 麻豆视频免费看 | 爱爱小视频网站 | 中文字幕日韩欧美一区二区三区 | av三级在线观看 | 久久精品国产综合 | 久久久久91 | 红桃视频成人免费网站 | 99久热 | 免费观看高清韩国日本大全 | 成人国产精品免费观看视频 | 国产欧美精品一区 | 欧美成人一区二区三区片免费 | 免费成人av | 91精品国产人妻国产毛片在线 | 亚洲国产精品99久久久久久久久 | 日本网站免费观看 | 日韩亚洲一区二区 | 一区二区在线视频观看 | 精品久久99 | 免费精品视频 | 福利视频一区二区三区 | 久久精品在线视频 |