问题描述
- 计算两个数字的最大公约数
算法阐述:
- 求解最大公约数时可以采取辗转相除的方式。
- 即如果需要求解A,B(A>B)的最大公约数可以采取首先使用A/B=R1...Q1
- 如果R1=0,则最大公约数为B。
- 如果R1!=0,则计算B/Q1=R2...Q2
- 如果R2=0,则最大公约数为Q1
- 如果R2!=0,则计算Q1/Q2=R2...Q3
- .......
代码:
//递归方式
int getGCD(int a, int b)
{
if (a % b == 0)
{
return b;
}
return getGCD(b, a % b);
}
//循环方式
int GCD(int A,int B)
{
int Rem;
while(B>0)
{
Rem = A % B;
A = B;
B = Rem;
}
return A;
}
时间复杂度
- 对于该算法来说,运行的时间取决于余数序列的长度,看起来难以判断。
- 但是根据定理:如果 M > N,则 M mod N < M/2。即每次迭代后,余数最多为原始值得一半,则时间复杂度为O(log N)