按照数学定义求。
最简单的 从较大数开始,一直累加出一个两个的共同渣仔倍数。
也可以先求最大如没汪公约数 然后用两个数的积除以最大公约数
int func(int a, int b){
int r
for( r=a r++)
if(r%a==0 &察槐& r%b==0) break
return r
}
1、对于输入的两个正整数m和n每次输入的大小顺序可能不同,为了使程序具有一般性,首先对整数所m和n进行大小排序,规定变量m中存储大数、变量n中存储小数。
C语言
2、输入的两个数,大数m是小数n的倍数,那圆稿段么大数m即为所求的最小公倍数;若大橘誉数m不能被小数n整除则需要寻找一个能同时被两数整除的自然数。
从大数m开始依次向后递增直到找到第一个能同时被两数整除的数为止,所以循环变量i的初值为寻找第一个能同时被两整数整除的自然数,并将其输出敬段。需要注意的是,在找到第一个满足条件的i值后,循环没必要继续下去,所以用break来结束循环。
3、在上面的分析过程中没有提到循环变量的终止条件,因i的最大值不能确定,像这种终止条件不确定的情况如何来表示?方法有两种,第一,可以把判定条件表示成循环变量满足的基本条件,如本例终止条件可表示成i>0;第二,终止条件省略不写,利用循环体中的语句结束循环,如在找到第一个满足条件的自然数时利用break语句结束循环。
程序
/*要求:必须使用数组做。
输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整羡晌拍数。
为每组测试数据输出它们的最小公倍数,每个测试实例的输出占一行。题目确保结果在32位整数范围谨塌内。
输入样例:2 4 6
输出样例: 12
感恩节快乐哦!
*/
#include <stdio.h>
#include <stdlib.h>
/* 欧几里得算法求 数字 a b 的最大公约数 */
int gcd(int a,int b)
{
if(a<b)
{
return gcd(b,a)
}
else if(b==0)
{
return a
}
else
{
return gcd(b,a%b)
}
}
/* 数字 a b 的最小公约数 */
int lcm(int a,int b)
{
return a*b/gcd(a,b)
}
int main(int argc, char *argv[])
{
int n,i,r
int *data=NULL
while(scanf("%d",&n)!=EOF)
{
// 动态申请数字空间
data = (int*)malloc(n*sizeof(n))
for(i=0i<ni++)
{
scanf("%d",&data[i])
}
// 特殊处理只有一个数字的情况
if(n==1)
{
r = data[0]
}
else
{
// 先求前两个数字的最小公倍数兄羡
r = lcm(data[0],data[1])
// 求第 i 个数字和前面所有数字的最小公倍数
for(i=2i<ni++)
{
r = lcm(r,data[i])
}
}
printf("%d\n",r)
// 释放空间
free(data)
}
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)