1014: 最小公倍數(shù)
Description
求兩個數(shù)的最小公倍數(shù)LCM(Least Common Multiple)
Input
每行包含兩個數(shù)a厉熟,b
當(dāng)a和b都等于0時表示輸入結(jié)束,這組數(shù)據(jù)不用輸出
Output
每行包含一個正整數(shù):a和b的最小公倍數(shù)
Sample Input
4 6
3 5
0 0
Sample Output
12
15
參考1:http://c.biancheng.net/view/509.html
問題分析
最小公倍數(shù)(Least Common Multiple刊驴,LCM)暑劝,如果有一個自然數(shù)a能被自然數(shù)b整除椰苟,則稱a為b的倍數(shù),b為a的約數(shù)拍嵌,對于兩個整數(shù)來說镐捧,指該兩數(shù)共有倍數(shù)中最小的一個潜索。計算最小公倍數(shù)時,通常會借助最大公約數(shù)來輔助計算懂酱。
最小公倍數(shù)=兩數(shù)的乘積/最大公約(因)數(shù)竹习,解題時要避免和最大公約(因)數(shù)問題混淆。
對于最小公倍數(shù)的求解列牺,除了利用最大公約數(shù)外整陌,還可根據(jù)定義進(jìn)行算法設(shè)計。要求任意兩個正整數(shù)的最小公倍數(shù)即,求出一個最小的能同時被兩整數(shù)整除的自然數(shù)泌辫。
算法設(shè)計
對于輸入的兩個正整數(shù)m和n每次輸入的大小順序可能不同随夸,為了使程序具有一般性,首先對整數(shù)所m和n進(jìn)行大小排序震放,規(guī)定變量m中存儲大數(shù)宾毒、變量n中存儲小數(shù)。
輸入的兩個數(shù)澜搅,大數(shù)m是小數(shù)n的倍數(shù)伍俘,那么大數(shù)m即為所求的最小公倍數(shù);若大數(shù)m不能被小數(shù)n整除則需要尋找一個能同時被兩數(shù)整除的自然數(shù)勉躺。從大數(shù)m開始依次向后遞增直到找到第一個能同時被兩數(shù)整除的數(shù)為止,所以循環(huán)變量i的初值為尋找第一個能同時被兩整數(shù)整除的自然數(shù)觅丰,并將其輸出饵溅。需要注意的是,在找到第一個滿足條件的i值后妇萄,循環(huán)沒必要繼續(xù)下去蜕企,所以用break來結(jié)束循環(huán)。
在上面的分析過程中沒有提到循環(huán)變量的終止條件冠句,因i的最大值不能確定轻掩,像這種終止條件不確定的情況如何來表示?方法有兩種懦底,第一唇牧,可以把判定條件表示成循環(huán)變量滿足的基本條件,如本例終止條件可表示成i>0聚唐;第二丐重,終止條件省略不寫,利用循環(huán)體中的語句結(jié)束循環(huán)杆查,如在找到第一個滿足條件的自然數(shù)時利用break語句結(jié)束循環(huán)扮惦。
參考2:https://blog.csdn.net/sinat_39591298/article/details/77119474(簡潔)
參考3:https://www.cnblogs.com/panweiwei/p/6214955.html(兩種方法)
//我的代碼
#include <stdio.h>
#include <math.h>
int main(){
int p,i,a,prom;
while(~scanf("%d%d",&p,&a)&&p&&a){
if(a>p){
prom=a;
a=p;
p=prom;
}
/*if(p%a==0) {
printf("%d\n",&p);
}
else */
for(int i=p;i>0;i++)
if(i%p==0&&i%a==0) {
printf("%d\n",i);
break;
}
break;
}
return 0;
}
//網(wǎng)上搜到的代碼(AC代碼)
#include<stdio.h>
int gcd(int a,int b)
{
? ? return (b>0)?gcd(b,a%b):a;
}
int main()
{
? ? int a,b;
? ? while(~scanf("%d%d",&a,&b)&&a&&b)
? ? {
? ? ? ? printf("%lld\n",(long long)a/gcd(a,b)*b);
? ? }
? ? return 0;
}