數學原理:
設有兩個數num1和num2,假設num1比較大。令余數r = num1 % num2。
當r == 0時,即num1可以被num2整除,顯然num2就是這兩個數的最大公約數。
當r != 0時,令num1 = num2(除數變被除數),num2 = r(余數變除數),再做 r = num1 % num2。遞歸,直到r == 0。
以上數學原理可以用具體的兩個數做一下分析,這樣容易理解。
代碼實現(求最大公約數):
代碼如下:
#include <iostream>
using namespace std;
int gcd(int a, int b);//聲明最大公約數函數
int main()
{
int num1 = 1;
int num2 = 1;
cin >> num1 >> num2;
while(num1 == 0 || num2 == 0)//判斷是否有0值輸入,若有則重新輸入
{
cout << "input error !" << endl;
cin >> num1 >> num2;
}
cout << "The gcd of " << num1 << " and " << num2 << " is: " << gcd(num1, num2) << endl;//調用最大公約數函數
return 0;
}
int gcd(int a, int b)//函數定義
{
int max = a > b ? a : b;
int min = a < b ? a : b;
a = max;
b = min;
int r = a % b;
if(0 == r)//若a能被b整除,則b就是最大公約數。
return b;
else
return gcd(b, r);//遞歸
}
最小公倍數的求法建立在求最大公約數的方法之上。因為最小公倍數等於兩個數的積除以最大公約數。
代碼實現(求最小公倍數):
代碼如下:
#include <iostream>
using namespace std;
int gcd(int a, int b);//聲明最大公約數函數
int main()
{
int num1 = 1;
int num2 = 1;
int lcm = 1;
cin >> num1 >> num2;
while(num1 == 0 || num2 == 0)//判斷是否有0值輸入,若有則重新輸入
{
cout << "input error !" << endl;
cin >> num1 >> num2;
}
lcm = num1 / gcd(num1, num2) * num2;//先除後乘可以在一定程度上防止大數
cout << "The lcm of " << num1 << " and " << num2 << " is: " << lcm << endl;
return 0;
}
int gcd(int a, int b)//函數定義
{
int max = a > b ? a : b;
int min = a < b ? a : b;
a = max;
b = min;
int r = a % b;
if(0 == r)//若a能被b整除,則b就是最大公約數。
return b;
else
return gcd(b, r);//遞歸
}
以上是僅僅限與求兩個書的最大公約數和最小公倍數,當數字有很多時,該法是否依然適用,還有待考證。