【C++解題報告】求最大公約數問題(輾轉相除法)
阿新 • • 發佈:2019-02-18
題目來源:
基礎班《函式、遞推、遞迴》,遞迴第5題。 描述: 總時間限制:1000ms 記憶體限制:65536KB 給定兩個正整數,求它們的最大公約數。 輸入: 輸入一行,包含兩個正整數(<1,000,000,000)。 輸出: 輸出一個正整數,即這兩個正整數的最大公約數。- 樣例輸入:
6 9
樣例輸出:
-
3
- 提示:
-
求最大公約數可以使用輾轉相除法:
假設a > b > 0,那麼a和b的最大公約數等於b和a%b的最大公約數,然後把b和a%b作為新一輪的輸入。
由於這個過程會一直遞減,直到a%b等於0的時候,b的值就是所要求的最大公約數。
比如:
9和6的最大公約數等於6和9%6=3的最大公約數。
由於6%3==0,所以最大公約數為3。 - 題目思路:
- 由題目的提示的,利用輾轉相除法求最大公約數。輾轉相除法:求a和b最大公約數,將a/b,如果a能整除b(a%b!=0),那麼b就是a的最大公約數。如果不等於0,將b作為新的被除數,a/b的餘數(a%b)作為新的除數。一直迴圈下去。這裡定義一個函式gcd(Greatest common divisor),並進行遞迴呼叫。
-
例如求24 和18的最大公約數:
程式碼:
using namespace std; int gcd(int a,int b) //定義函式gcd 計算 { if(a%b==0) return b; // 如果a能整除b 則b為最大公約數 else return gcd(b,a%b); //如果不能整除,則將b作為新的被除數,a作為新的除數, } int main() //定義主函式 { int a,b; //定義變數 a,b cin>>a>>b; //輸入 cout<<gcd(a,b); //輸出a,b的最大公約數 return 0; }