設兩數為a、b(a>b),求a和b最大公因數(a,b)的步驟如下:
用a除以b,得a÷b=q......r1(0≤r1)。若r1=0,則(a,b)=b;若r1≠0,則再用b除以r1,得b÷r1=q......r2 (0≤r2).若r2=0,則(a,b)=r1,若r2≠0,則繼續用r1除以r2,……如此下去,直到能整除為止。其最后一個為被除數的余數的除數即為(a, b)。
例如:a=25,b=15,a/b=1......10,b/10=1......5,10/5=2.......0,最后一個為被除數余數的除數就是5,5就是所求最大公因數。
C++程序:
#include<iostream>
using namespace std;
int gcd(int a,int b) //歐幾里得算法即展轉相除法
{
int t=a%b;
while(t!=0) //可用裝逼寫法while(t)
{
a=b;
b=t;
t=a%b;
}
return b;
}
int main()
{
freopen("p.in","r",stdin);
freopen("p.out","w",stdout); //文件的輸入與輸出
int a,b;
cin>>a>>b;
cout<<gcd(a,b)<<endl; //直接調用函數
return 0;
}
以上為普通做法,下面采用裝逼做法,把gcd函數變成遞歸,程序如下:
#include<iostream>
using namespace std;
int gcd(int a,int b)
{
return (b==0)?a:gcd(b,a%b); //一條語句搞定(三元運算符)裝逼,跟上面略有不同,上面做到t=0,這里做到b=0
}
int main()
{
freopen("p.in","r",stdin);
freopen("p.out","w",stdout); //采用文件調用,習慣且方便
int a,b;
cin>>a>>b;
cout<<gcd(a,b)<<endl;
return 0;
}
備注與說明:
“ ? : ”是一個三元運算符,其構成的表達式格式為:
<表達式1> ? <表達式2> : <表達式3>
例如:
if (a>b) max=a;
else max=b;
可寫成:
max=a>b?a:b;
