求GCD(最大公約數)的兩種方式
這篇隨筆講解C++語言程序設計與應用中求GCD(最大公約數,下文使用GCD代替)的兩種常用方式:更相減損法和輾轉相除法,前提要求是具有小學數學的基本素養,知道GCD是什么,並具有C++的語法基礎。
一、更相減損法
兩個正整數a和b(a>b),它們的最大公約數等於a-b的差值c和較小數b的最大公約數。
(這是我國人民智慧的結晶)
我來介紹一下這個算法的優點,就是避免了大整數取模導致效率低下,但是運算次數要比輾轉相除多得多,所以我們在使用的時候需要判斷一下。
代碼:
int gcd(int a,int b)
{
if(a==b)
return a;
if(a>b)
return gcd(a-b,b);
if(a<b)
return gcd(b-a,a);
}
二、輾轉相除法
兩個正整數a和b(a>b),它們的最大公約數等於a除以b的余數c和b之間的最大公約數。
其實就是把更相減損變得更高級一點(加減運算變乘除運算,提升了一個級別)
但是大整數取模會讓一些題極為頭疼,所以我們還是要慎重考慮什么時候用更相減損什么時候用輾轉相除。
(同樣是我國人民智慧的結晶)
代碼:
int gcd(int a,int b)
{
if(b==0)
return a;
else
return gcd(b,a%b);
}
條件表達式寫法:
是輾轉相除法的一個簡便寫法,只用一行即可搞定:
int gcd(int x,int y)
{
return y?gcd(y,x%y):x;
}