C语言求最小公倍数
问题描述
求任意两个正整数的最小公倍数(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: %d\n", m, n, i);
break;
}
return 0;
}</n)></stdio.h>
运行结果:
Input m & n:6 24
The LCW of 24 and 6 is: 24
- C语言求最大公约数
- 如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。几个自然数公有的约数,叫做这几个自然数的公约数。
- 03-12 关注:0
- C语言求勾股数
- 所谓勾股数,是指能够构成直角三角形三条边的三个正整数(a,b,c)。
- 03-11 关注:3
- C语言求回文数
- 将数组中元素重新组合成一新数。拆分时变量a的最高位仍然存储在数组中下标最大的位置
- 03-11 关注:3
- C语言水仙花数
- 输出所有的“水仙花数”,所谓的“水仙花数”是指一个三位数其各位数字的立方和等于该数本身,例如153是“水仙花数”,因为:153 = 13
- 03-11 关注:3
- C语言求自守数
- 自守数是指一个数的平方的尾数等于该数自身的自然数。
- 03-11 关注:2
- C语言求亲密数
- 如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A
- 03-11 关注:2