題目描述
輸入兩個正整數m和n,求其最大公約數和最小公倍數。
輸入
兩個整數
3輸出
最大公約數,最小公倍數
樣例輸入
5 7
樣例輸出
1 35
解析
輾轉相除法
輾轉相除法是古希臘求兩個正整數的最大公約數的,也叫歐幾里德算法,其方法是用較大的數除以較小的數,上面較小的除數和得出的余數構成新的一對數,繼續做上面的除法,直到出現能夠整除的兩個數,其中較小的數(即除數)就是最大公約數。以求288和123的最大公約數為例,操作如下:
288÷123=2余42
123÷42=2余39
42÷39=1余3
39÷3=13
所以3就是288和123的最大公約數。
注意事項:
輾轉相除法在編程的實現,一個弊端就是必須是用大數對小數取余,所以要提前用條件語句判斷三種可能情況
因為變量數較多,或者會有重復使用先前變量的步驟,而先前變量可能被改變,所以要提前用一些中間變量儲存先前變量的值。
兩數的乘積再除以兩數的最大公約數法。
這個方法雖然比較復雜,但是使用范圍很廣。因為兩個數的乘積等于這兩個數的最大公約數和最小公倍數的乘積。例如: 4和6的最大公約數是2,最小公倍數是12,那么,4X6=2X 12。
運行結果
#include<iostream>
using namespace std ;
int main()
{
int t = 1 ;//取余計算的余數,賦值為1是為了方便進入while循環
int m,n ;
cin>>m>>n ;
int nNum1 = m ;//中間變量:保存m
int nNum2 = n ;//中間變量:保存n
if(m > n)//判斷兩數的大小,保證用大數對小數取余
{
while(t != 0)
{
t = m % n ;
m = n ;//將隨后循環中的m變成本次循環計算后的n
n = t ;//將隨后循環中的n變成本次循環計算后的t
}
int b = (nNum1 * nNum2) / m ;//利用性質求出最小公倍數
cout<<m<<" "<<b<<endl ;
}
else if(m < n)
{
while(t != 0)
{
t = n % m ;
n = m ;
m = t ;
}
int b = (nNum1 * nNum2) / n ;
cout<<n<<" "<<b<<endl ;
}
else//當m=n時,最大公因數和最小公倍數相等,都等于他們本身
{
cout<<n<<" "<<n<<endl ;
}
return 0 ;
}
參考結果
- 若有問題,請評論出來;