你所不知道的求三个数的最小公倍数的解法
从键盘上输入三个数,求其最小公倍数。
分析:最小公倍数是指能整除这三个数的公倍数中的最小者,可以利用循环穷举的方法,看是否能整除这三个数。若能整除这三个数,则输出其中的最小的数即为最小公倍数。
第一种方法:最常见的方法。
常见代码如下:
#include<stdio.h>
int max(int a,int b,int c) //自定义函数max
{
if(a>b&&a>c) // 若a的值最大
return a; // 返回a
else if(b>a&&b>c) // 若b的值最大
return b; // 返回b
else
return c; // 否则返回c
}
void main()
{
int x,y,z,i,j,k;
printf("请输入三个数:");
scanf("%d%d%d",&x,&y,&z); // 从键盘输入三个数
k = max(x,y,z); //调用max函数求出其中的最大值
i= 1;
1hile(1) //while循环,条件值为1
{
j = k * i;
if((j%x==0)&&(j%y==0)&&(j%z==0)) //满足条件,退出循环
break;
i++;
}
printf("最小公倍数为%d\n",j);
}
运行结果如下:
第二种方法:通过短除法实现。
短除法: 短除法思想为求三个数的因素,然后求这些因素的求积。算法设计代码如下:
#include<stdio.h>
int max(int a,int b,int c)
{
if(a>b&&b>c)
return a;
else if(b>a&&b>c)
return b;
else
return c;
}
void main()
{
int x,y,z,i,j,k,t=1;
printf("请输入三个数:");
scanf("%d%d%d",&x,&y,&z);
k = max(x,y,z);
for(i=2;i<=k;i++)
{
j = 1;
while(j)
{
j=0;
if(x%i==0)
{
x = x/i;
j = 1;
}
if(y%i==0)
{
y = y/i;
j = 1;
}
if(z%i==0)
{
z = z/i;
j = 1;
}
if(j==1)
t = t * i;
}
k = max(x,y,z);
}
printf("最小公倍数为:%d\n",t);
}
运行结果如下:
代码分析:利用短除法求三个数的因子,然后求所有因子的乘积,即为最小公倍数,其中 j 作为循环是否进行的标志。
运行结果:该程序的执行结果与算法1 的结果一样。
第三种方法 : 求三个数的最小公倍数,可以先求两个数的最小公倍数,然后利用函数的嵌套求这三个数的最小公倍数。算法如下:
#include<stdio.h>
int f(int x,int y)
{
int a, b, c;
a = x;
b = y;
c = x%y;
while(c!=0)
{
x = y;
y = c;
c = x%y;
}
return a*b/y;
}
void main()
{
int a , b , c , d;
printf("请输入三个数:");
scanf("%d%d%d",&a,&b,&c);
d = f( f(a,b),c); //嵌套调用函数f()求解
printf("最小公倍数为:%d\n",d);
}
运行结果如下:
代码分析:第2~15行,自定义函数 f(),用来求两个数的最小公倍数,第21行,嵌套调用函数 f(),求得三个数的最小公倍数。
运行结果:该程序的执行结果与算法1和算法2 的结果一样。