请教C语言问题 谢谢了 在线等
main(){longm,n,i=1,j,s;scanf("%ld,%ld",&m,&n);for(;i<=m&&i<=n;i++){if(m%i==0&&n%i==0)...
main()
{long m,n,i=1,j,s;
scanf("%ld,%ld",&m,&n);
for(;i<=m&&i<=n;i++)
{if(m%i==0&&n%i==0) s=i;}
if(m>=n) j=m;
else j=n;
for(;!(j%m==0&&j%n==0);j++);
printf("s=%ld,j=%ld\n"
,s,j);
}
这个里面的第二个FOR语句里那个为什么要取反啊 有什么意义?我是初学菜鸟 展开
{long m,n,i=1,j,s;
scanf("%ld,%ld",&m,&n);
for(;i<=m&&i<=n;i++)
{if(m%i==0&&n%i==0) s=i;}
if(m>=n) j=m;
else j=n;
for(;!(j%m==0&&j%n==0);j++);
printf("s=%ld,j=%ld\n"
,s,j);
}
这个里面的第二个FOR语句里那个为什么要取反啊 有什么意义?我是初学菜鸟 展开
5个回答
展开全部
这里的两个FOR里没有取反的,!(j%m==0&&j%n==0)不是取反,而叫逻辑非。
该程序功能是求两个数的最大公约数和最小公倍数。
它要找到两个数的最小公倍数,要求就是j都能被这两个数整除,如果它不取非,找到最小公倍数后就会运行第二个FOR语句,可是第二个FOR语句只有一个";"说明是空语句,如果这样这个程序就会成为一个永远执行不完的程序(死循环)。取非之后,就是如果没找到就会一直循环下去,但是两个数一定会有一个最小公倍数的,所以不会造成死循环,找到之后就不会再运行第二个for循环。最后输出两个数的最大公约数和最小公倍数。
该程序功能是求两个数的最大公约数和最小公倍数。
它要找到两个数的最小公倍数,要求就是j都能被这两个数整除,如果它不取非,找到最小公倍数后就会运行第二个FOR语句,可是第二个FOR语句只有一个";"说明是空语句,如果这样这个程序就会成为一个永远执行不完的程序(死循环)。取非之后,就是如果没找到就会一直循环下去,但是两个数一定会有一个最小公倍数的,所以不会造成死循环,找到之后就不会再运行第二个for循环。最后输出两个数的最大公约数和最小公倍数。
追问
谢谢您 我想请教您一下想这样写,错在哪里呢
main()
{long m,n,i=1,j,s,y;
scanf("%ld,%ld",&m,&n);
for(;i=n) j=m;
else j=n;
for(;(j>m&&j>n);j++)
{
if(j%m==0&&j%n==0)
{
y=j;
}
}
printf("s=%ld,j=%ld\n"
,s,y);
}
还有,就是我把源程序的j赋给一个变量之后再输出为什么结果不一样呢 望指教
追答
for(;(j>m&&j>n);j++)
你里面那()不是英文的()。在代码里要全部是英文输入,只有注释可以用其他文
展开全部
其实这个就是一个逻辑命题的问题,第二个for循环的作用是要求出m和n的最小公倍数。
最小公倍数无疑满足条件j%m==0&&j%n==0。利用for循环来求取最小公倍数j。
j的初始值为m和n中的较大者,循环条件就是关键了。
若j%m==0&&j%n==0,则说明j已经是最小公倍数了,那么肯定得取反,即当j不是公倍数时,继续j自增。
关于你追问上写的那个程序,循环条件是(j>m&&j>n),而j的初始值是m和n中的较大者,也就是说,j一开始就不满足循环条件,当然就不会进入的for循环里,因此是不对的。
最小公倍数无疑满足条件j%m==0&&j%n==0。利用for循环来求取最小公倍数j。
j的初始值为m和n中的较大者,循环条件就是关键了。
若j%m==0&&j%n==0,则说明j已经是最小公倍数了,那么肯定得取反,即当j不是公倍数时,继续j自增。
关于你追问上写的那个程序,循环条件是(j>m&&j>n),而j的初始值是m和n中的较大者,也就是说,j一开始就不满足循环条件,当然就不会进入的for循环里,因此是不对的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这段程序应该是求最大公约数跟最小公倍数的。
s是最大公约数,j是最小公倍数,第二个for循环,不满足!(j%m==0&&j%n==0)时,即!(j%m==0&&j%n==0)为假时跳出循环,此时(j%m==0&&j%n==0)为真,j是m和n的公倍数,因为j是从m和n中的较大值时开始取值,并且在第一次满足(j%m==0&&j%n==0)时跳出了循环,所以j是m和n的最小公倍数。
s是最大公约数,j是最小公倍数,第二个for循环,不满足!(j%m==0&&j%n==0)时,即!(j%m==0&&j%n==0)为假时跳出循环,此时(j%m==0&&j%n==0)为真,j是m和n的公倍数,因为j是从m和n中的较大值时开始取值,并且在第一次满足(j%m==0&&j%n==0)时跳出了循环,所以j是m和n的最小公倍数。
追问
谢谢您 麻烦有时间再帮忙看下我上面的追问
追答
我直接从这个网页上复制的代码,编辑器提示第二个for循环的(j>m&&j>n)这两个括号不是英文的。
第二个for循环可以修改成下面这种方式
for(;;j++)
if(j%m==0&&j%n==0)
{
y=j;
break;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
j%m==0&&j%n==0是说j是m,n的公倍数
就是【同时满足】才是公倍数
如果不同时满足,或者都不满足
那值就是假,表达式为0
意思是【j不是m,n的公倍数】
取反的意思是【!(j不是m,n的公倍数)】
双重否定
是公倍数的时候打印 j
就是【同时满足】才是公倍数
如果不同时满足,或者都不满足
那值就是假,表达式为0
意思是【j不是m,n的公倍数】
取反的意思是【!(j不是m,n的公倍数)】
双重否定
是公倍数的时候打印 j
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
取反指的是只要条件(j%m==0&&j%n==0)不成立,就继续循环,直到(j%m==0&&j%n==0)循环终止
建议你写成(j%m==0)&&(j%n==0),&&两边同时成立的条件最好有括号。其实这个循环结构你也可以写出while(!(j%m==0&&j%n==0)){ 循环体;i++}
建议你写成(j%m==0)&&(j%n==0),&&两边同时成立的条件最好有括号。其实这个循环结构你也可以写出while(!(j%m==0&&j%n==0)){ 循环体;i++}
追问
这是个求最大公约数和最小公倍数的,请教您一下想这样写,错在哪里呢
main()
{long m,n,i=1,j,s,y;
scanf("%ld,%ld",&m,&n);
for(;i=n) j=m;
else j=n;
for(;(j>m&&j>n);j++)
{
if(j%m==0&&j%n==0)
{
y=j;
}
}
printf("s=%ld,j=%ld\n"
,s,y);
}
还有,就是我把源程序的j赋给一个变量之后再输出为什么结果不一样呢 望指教
追答
for(;(j>m&&j>n);j++)
{
if(j%m==0&&j%n==0)
{
y=j;
}
}这里有问题吧,首先要改为 for(;(j>=m)&&(j>=n);j++),比如你输入两个相等的数,最小公倍数不就等于这个数吗?还有,你的循环条件有问题,j++,没有上限,你求的应该是最小公倍数,当找出第一个这样的数就应该终止循环,比如2,3,找到6就应该停止,但你写的一直在找更大的公倍数,知道越界,所以y的值的长度和long int的最大长度一样,你看是不是。这里要改,你先想想
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询