欧几里得算法求得的是两个整数的最大公因式。而这是一个快速算法。
两次迭代之后余数最多是原值的一般,所以迭代次数最多是2logN = O(logN)级别的。
证明我就不放在这里了。然后2logN次数是最差情况,这个情况是在两个数为相邻的斐波那契数的时候。
代码如下:
//
// main.cpp
// Euclid
//
// Created by Alps on 14-7-24.
// Copyright (c) 2014年 chen. All rights reserved.
//
#include <iostream>
using namespace std;
int Eud(int M, int N){
int tmp;
while (N > 0) {
tmp = M % N;
M = N;
N = tmp;
}
return M;
}
int main(int argc, const char * argv[])
{
int M, N;
scanf("%d %d",&M, &N);
if (M < N) {
M += N;
N = M - N;
M = M - N;
}
int Rem = Eud(M, N);
printf("Rem is %d\n",Rem);
return 0;
}
这里说下,在Main函数里,有个if 那个是当M 比 N小的时候,交换M 和 N,这个方法是不引入第三个数的方法来交换的,其实我知道的还有两种办法,(位于和位或的办法)。可以看下~
其他的都很简单了~