在求最大公约数的时候可以使用辗转相除法
大概思想 (比如 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;
}
}
读者可以理解一下文字意思与代码含义