C语言中的while语句的判别式?

这个程序是辗转相除法,为什么不是while (m%n==0)?

这是求两个数最大公因数的程序,用的是“辗转相除法”。
辗转相除法的思想是:大数除以小数,得到余数,然后反复用小数(前面的除数)再除以余数,得到新的余数,直至余数为0,这时的除数就是最大公约数。写成程序应该是这样的:
大数赋值;
小数赋值;
while(大数除以小数的余数不等于0){
先把大数除以小数的余数临时记录下来;
小数赋值给大数;
余数赋值给小数;
(接下来回到while语句再判断新大数除以新小数的余数是否为0)
}
打印小数的值,就是最大公约数;
实现上述程序的语句就是:
int m=24;//用m表示大数
int n=18;//用n表示小数
while(m%n!=0){//建立循环
r=m%n;//用变量r临时储存余数
m=n;//把小数赋值给大数去做被除数
n=r;//把余数赋值给小数
}
printf("%d\n",n);//打印小数的值,即最大公因数。
注意,在c语言中,单个数字也可以解释为逻辑值,并规定,0为逻辑假,除了0以外的数字都是逻辑真。当while()后面的括号中需要一个逻辑值时,因0、2>3都是逻辑假,而5、-1、4<9都是逻辑真,即3!=0和3都是逻辑真,就有了a!=0与a的逻辑值完全相当的结论,故可以用m%n代替m%n!=0,while那一句就写成了:while(m%n)。
注意,while(m%n==0)的含义完全不同,它是说当大数除以小数的余数为0时继续循环,也就是继续相除,岂不是反了?
有什么不明白之处请留言。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2021-07-26
while的条件是满足条件执行循环。你这里是不能整除时执行循环。所以不能是m%n==0,应该是m%n!=0,简写为m%n。你这个是辗转相除求最大公约数,你去看看欧几里德定理的原理就好理解了。追问

原来是简写,没读懂(m%n)

那如果在while上面加一句m%n=0这样的话在写(m%n)的话循环就一次也不执行了对吗,因为我赋值为0,判断他为假是这么理解吗

追答

没有m%n=0这样的赋值语句。如果m能被n整除,就不会执行循环。
所有表达式计算的结果为非0时,放在条件里,if 或者 while循环条件等位置,都可以简写。
一个变量放在这些位置也可以这样写。
if(j){条件成立执行}
上面的变量j不为0时执行。

本回答被提问者采纳
第2个回答  2021-12-20
这个程序是辗转相除法,如果不省略的话,应该是while(m%n!=0),而不是while(m%n==0)。这样写的话,不但代码更加简洁,而且在实际运算时效率会更高。
第3个回答  2021-12-05
那样的写法也是可以的,因为括号中就是条件而已,你的那种写法跟图片的写法都是可以的。
相似回答