輾轉相除法與更相減損數
阿新 • • 發佈:2018-05-11
每一個 block != pre center 相同 none turn 算法
已知a、b求a與b的最大公因數與最小公倍數?
先說最大公因數
一種正常的算法是把a、b改寫成多個素數的冪相乘。比如a=36和b=54,那麽a=2^2*3^2,b=2^1*3^3。最大公因數就是取相同的素數的最小指數相乘,即2^1*3^2=18。親愛的wyt理解這個就行了,下面可以不用看。
再來說說輾轉相除法。它是用a、b中的大數對小數取余,再把余數和小數中的較小數取余,一直這樣做,直到剛好整除,余數為0。比如36與54,先算54%36=18,再算36%18=0,結束,這裏的18即為所求。
int a,b; int zhanzhuan(int x,int y) {ヾ(?°?°?)??if(x%y==0) return y; else return zhanzhuan(y,x%y); } int main() { cin>>a>>b; cout<<zhanzhuan(max(a,b),min(a,b)); }
然後是更相減損術,這個算法是把a、b中的大數減小數,然後把小數與差中的大數減小數,直到減到減數和差一樣,此時的差即為所求。
比如36與54,先算54-36=18,再算36-18=18,此時18=18,18就是最大公因數了。
int a,b;[]~( ̄▽ ̄)~*int gengxiang(int x,int y) { while(x!=y) { if(x>y) x=x-y; else y=y-x; } return x; } int main() { cin>>a>>b; cout<<gengxiang(max(a,b),min(a,b)); }
這樣我會的方法就沒了。
然後再說最小公倍數。
一種正常的算法是把a、b改寫成多個素數的冪相乘。比如a=36和b=54,那麽a=2^2*3^2,b=2^1*3^3。最小公倍數就是取所有的素數的最大指數相乘,即2^2*3^3=108。不用懷疑我就是從上面粘貼的,為什麽能粘貼呢?其實看看這倆方法就可以發現,ab作為兩個數,最小公倍數最大公因數一個取最大指數一個取最小指數,那麽每一個數分解出的素數的冪肯定都取到兩個數中了,那麽就有
最小公倍數*最大公約數=a*b
這樣求最小公倍數和求最大公約數就是同一個問題了,你還不會麽?
輾轉相除法與更相減損數