(1)欧几里得算法
defination:if x and y are positive and x >= y,then gcd(x,y) = gcd(x mod y,y)。又叫辗转相除法,用于求解最大公约数,时间复杂度为O(log n)(n 为二进制的长度)。
proof::首先,我们应该知道:如果一个数可以除尽x,y,那么它一定能除尽x-y。那么我们可以得到gcd(x,y) = gcd (x-y,y).以此类推,
gcd(x-y,y) = gcd(x-2y,y) =...........=gcd(x mod y,y)。
又叫辗转相除法,用于求解最大公约数,时间复杂度为O(n^3)(n 为二进制的长度)。
递归:
#include <iostream>
using namespace std;
int Euclid(int x,int y)
{
if(y == 0)
return x;
else
return Euclid(y,x % y);
}
int main()
{
int x,y;
cin >> x >> y;
if(x < y)
swap(x,y);
cout << Euclid(x,y) << endl;
system("pause");
return 0;
}
Lemma 1. if a >= b ,then