輾轉相除法
在求最大公約數的時候可以使用輾轉相除法
大概思想 (比如 25 15)
25 15 25%15=10
15 10 15%10=5
10 5 10%5=0
5 0-------------》由此可得最大公約數為5
程式碼如下
int GCD(int a,int b)
{
return b==0?a:GCD(b,a%b);
}
有時候用輾轉相除法的時候會卡時間。那麼,在這時候我們就需要用到二進位制演算法
二進位制演算法思路(不斷去除因子2)
若x==y 則GCD(x,y)=x否則:
1、若x,y都是偶數,則GCD(x,y)=2*GCD(x/2,y/2);
2、若x為偶數,y為奇數,則GCD(x,y)=GCD(x/2,y);
3、若x為奇數,y為偶數,則GCD(x,y)=GCD(x,y/2);
4、若x,y都是奇數,則GCD(x,y)=GCD(x-y,y);
程式碼實現如下
#include<iostream>
using namespace std;
int GCD(int x,int y)
{
int i,j;
if(x == 0) return x;
if(y == 0) return y;
for(i = 0;0 == (x&1); ++i) x>>=1; //去掉所有的2
for(i = 0;0 == (y&1); ++i) y>>=1; //去掉所有的2
if(j < i) i = j;
while(1)
{
if(x < y) x ^= y,y ^= x,x ^= y; //若x<y 交換x y
if(0 == (x -= y)) return y<<i;
//若x == y,gcd==x==y(就是在輾轉減,while(1)控制)
while(0 == (x&1)) x >>= 1; //去掉所有的2
}
}
int main()
{
int m,n;
while(cin>>m>>n)
{
cout<<GCD(m,n)<<endl;
}
}
讀者可以理解一下文字意思與程式碼含義
相關文章
- 輾轉相除法原理
- 輾轉相除法的原理
- 證明:輾轉相除法與更相減損術
- 透徹理解輾轉相除法
- 輾轉相除法 氣泡排序排序
- 輾轉相除法原理解析
- C++中的輾轉相除法C++
- 【C語言】聊聊輾轉相除法C語言
- 輾轉相除法與更相減損術(求最大公約數)
- 求最大公約數(輾轉相除法)
- 【演算法分析與設計】輾轉相除法演算法
- 輾轉相除法(歐幾里得演算法)(gcd)模板及其原理演算法GC
- 求最大公約數不同演算法的時間比較(輾轉相除法,更相減損術等)演算法
- [待更新]歐幾里得演算法(輾轉相除法)與擴充歐幾里得演算法演算法
- 除法與GCD演算法的相關分析GC演算法
- C++等差數列(數論、歐幾里得輾轉相除gcd)C++GC
- android kotlin 安全除法AndroidKotlin
- scss不能用除法?CSS
- 除法謎題(2)
- 除法謎題(1)
- 多項式除法
- JavaScript / 除法運算子JavaScript
- Http請求相關(轉)HTTP
- 乘法◆除法◆謎題(7)
- 乘法◆除法◆謎題(11)
- 乘法◆除法◆謎題(9)
- 乘法◆除法◆謎題(8)
- 乘法◆除法◆謎題(6)
- 乘法◆除法◆謎題(5)
- 乘法◆除法◆謎題(4)
- 乘法◆除法◆謎題(3)
- 乘法◆除法◆謎題(2)
- 乘法◆除法◆謎題(1)
- 乘法◆除法◆謎題(20)
- 乘法◆除法◆謎題(18)
- 乘法◆除法◆謎題(19)
- 乘法◆除法◆謎題(21)
- 乘法◆除法◆謎題(12)