求最大公因數(輾轉相除法&更相減損術)
輾轉相除法
又名歐幾里得算法 ,其原理其實是基於這個定理:\(gcd(a,b)=gcd(b,a\%b)\),詳細證明,而任何數與0的最大公約數是它本身 (遞歸終止條件),所以可以如下遞歸求出兩數最大公因數:
\[f(a,b)=\left\{ \begin{array}{lll} b \qquad a\%b=0\\ f(b,a\%b) \end{array} \right. \]
遞歸實現(C++):
int f(int a, int b){
return (b==0)?(a):f(b,a%b);
}
無需判斷a,b的大小關系
更相減損術
出自《九章算術》,其依據原理:兩個正整數a和b(a>b),它們的最大公約數等於a-b的差值c和較小數b的最大公約數,同理,所以可以如下遞歸求出兩數最大公因數:
\[f(a,b)=\left\{ \begin{array}{lll} a \qquad a=b\\ f(b,a-b) \end{array} \right. \]
遞歸實現(C++):
#include <iostream>
#include <algorithm>
using namespace std;
int f(int a, int b){//a>b
int r=a-b;
if(r==0) return b;
if(r>b) return f(r,b);
else return f(b,r);
}
int main(){
int a,b;
cin>>a>>b;
if(a<b)
swap(a,b);
cout<<f(a,b);
return 0;
}
本文采用 知識共享 署名-非商業性使用-相同方式共享 3.0 中國大陸 許可協議進行許可。歡迎轉載,請注明出處: 轉載自:Santiego的博客