1014:公倍数

1014: 最小公倍数

Description

求两个数的最小公倍数LCM(Least Common Multiple)

Input

每行包含两个数a,b

当a和b都等于0时表示输入结束,这组数据不用输出

Output

每行包含一个正整数:a和b的最小公倍数

Sample Input

4 6

3 5

0 0

Sample Output

12

15


参考1:http://c.biancheng.net/view/509.html

问题分析

最小公倍数(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语句结束循环。

参考2:https://blog.csdn.net/sinat_39591298/article/details/77119474(简洁)

参考3:https://www.cnblogs.com/panweiwei/p/6214955.html(两种方法)


//我的代码
#include

#include

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;

}

//网上搜到的代码(AC代码)

#include

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;

}

你可能感兴趣的:(1014:公倍数)