C语言用短除法求三个数的最小公倍数,程序没有语法错误,和书上的一模一样,但是运行不出结果?求大神!

#include<stdio.h>

int max(int x,int y,int z)
{
if(x>y&&x>z)
return(x);
else if(y>x&&y>z)
return(y);
else return(z);
}

int mod(int d, int e)
{
return d%e;
}

int main()
{
int x1,x2,x3,t=1,i,flag;
int x0;
printf("请依次输入这3个数,用空格隔开,回车结束");
printf("\n");
scanf("%d %d %d",&x1,&x2,&x3);
x0=max(x1,x2,x3);
printf("\n");
printf("%d,%d,%d",x1,x2,x3);
printf(" 这3个数的最小公倍数是");

for (i=2;i<=x0;i=i+1) ;
{
flag=1;
while(flag=1)
{
flag=0;
if (mod(x1,i)==0)
{
x1=x1/i; flag=1;}
if(mod(x2,i)==0)
{
x2=x2/i; flag=1;}
if(mod(x3,i)==0)
{
x3=x3/i; flag=1;}

if (flag=1)
t=t*i;
}//while结束符

x0=max(x1,x2,x3);
}//for结束符
printf("%d",t);
printf("\n");
}

解:程序的思路错了,错在:t=t*i。
按照程序的思路是:现求出3个数中最大的数,这个最大的数作为出for循环的条件,而for循环的功能是:找出所有能被那3个数整除的数(不是要求同时被那3个数整除);而while循环结束后,执行下一句:x0=max(x1,x2,x3); ,是重新找出那3个数中最大的数,因为经过了3个if语句中:x1=x1/i;x2=x2/i;x3=x3/i;后,x1、x2、x3的值都可能发生了改变,到最后把找到的所有i的值都相乘,即最大公倍数。
那我们假设那3个数是:3、8、9
因为9最大,此时x0=9。
当i=2时,经过while时,这3个数变成:3、4、9,此时还是9最大,while时结束后,经过这句:x0=max(x1,x2,x3); 后,那么此时x0=9。
当i=3时,经过while时,这3个数变成:1、4、3,此时最大的数为4,while时结束后,经过这句:x0=max(x1,x2,x3); 后,那么此时x0=4。
当i=4时,经过while时,这3个数变成:1、1、3,此时最大的数为3,while时结束后,经过这句:x0=max(x1,x2,x3); 后,那么此时x0=3。
接下来for循环结束了,因为这句:i<=x0;,4比3大,for循环不执行了。
那么经过t=t*i后得:2X3X4=24,显然不是最小公倍数,思路也是错在这里。
综上得出本人的修改结果:t=t*i; 这句保留,在for循环结束后,加上这句:t=t*x1*x2*x3;即可。也就是:假设中的:24X1X1X3=72。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-10-19
没运行你的程序,不过这两个地方是有问题的:while(flag=1) if (flag=1)追问

书上写一开始flag=1是为了保证程序能进入循环,一进去就置0了。后面的if (flag=1)是做完一次短除以后flag会变成1,检测是否进行了一次短除。如果有错,能改一下吗?我不知道怎么改才是对的了

追答

判断要用==

追问

试过了,改这个没有区别,还是运行不出结果

追答

额。。。这一行也是有问题的 for (i=2;i<=x0;i=i+1) ;
要把后面的;去掉,否则循环体是空的。。。

追问

泪流满面,试过了……还是不出结果……大神求帮忙啊,这个程序出答案比生孩子还难……

追答

不会吧。。。我都运行ok呀
请依次输入这3个数,用空格隔开,回车结束
10 20 50

10,20,50 这3个数的最小公倍数是100

追问

我俩私聊吧,我先给你采纳了

本回答被提问者采纳
相似回答