問題描述
求任意兩個正整數的最小公倍數(LCM)。
問題分析
最小公倍數(Least Common Multiple,LCM),如果有一個自然數a能被自然數b整除,則稱a為b的倍數,b為a的約數,對於兩個整數來說,指該兩數共有倍數中最小的一個。計算最小公倍數時,通常會藉助最大公約數來輔助計算。
最小公倍數=兩數的乘積/最大公約(因)數,解題時要避免和最大公約(因)數問題混淆。
對於最小公倍數的求解,除了利用最大公約數外,還可根據定義進行演算法設計。要求任意兩個正整數的最小公倍數即,求出一個最小的能同時被兩整數整除的自然數。
演算法設計
對於輸入的兩個正整數m和n每次輸入的大小順序可能不同,為了使程式具有一般性,首先對整數所m和n進行大小排序,規定變數m中儲存大數、變數n中儲存小數。
輸入的兩個數,大數m是小數n的倍數,那麼大數m即為所求的最小公倍數;若大數m不能被小數n整除則需要尋找一個能同時被兩數整除的自然數。從大數m開始依次向後遞增直到找到第一個能同時被兩數整除的數為止,所以迴圈變數i的初值為尋找第一個能同時被兩整數整除的自然數,並將其輸出。需要注意的是,在找到第一個滿足條件的i值後,迴圈沒必要繼續下去,所以用break來結束回圈。
在上面的分析過程中沒有提到回圈變數的終止條件,因i的最大值不能確定,像這種終止條件不確定的情況如何來表示?方法有兩種,第一,可以把判定條件表示成迴圈變數滿足的基本條件,如本例終止條件可表示成i>0;第二,終止條件省略不寫,利用迴圈體中的語句結束回圈,如在找到第一個滿足條件的自然數時利用break語句結束回圈。
下面是完整的程式碼:
#include<stdio.h>
int main()
{
int m, n, temp, i;
printf("Input m & n:");
scanf("%d%d", &m, &n);
if(m<n) /*比較大小,使得m中儲存大數,n中儲存小數*/
{
temp = m;
m = n;
n = temp;
}
for(i=m; i>0; i++) /*從大數開始尋找滿足條件的自然數*/
if(i%m==0 && i%n==0)
{/*輸出滿足條件的自然數並結束回圈*/
printf("The LCW of %d and %d is: %dn", m, n, i);
break;
}
return 0;
}
執行結果:
Input m & n:6 24
The LCW of 24 and 6 is: 24