While 语句 问题

[复制链接]
查看11 | 回复9 | 2021-1-27 06:52:00 | 显示全部楼层 |阅读模式
while(x%2!=1&&x%3!=2&&x%5!=4&&x%6!=5&&x%7!=0)
x++;
while(!(x%2==1&&x%3==2&&x%5==4&&x%6==5&&x%7==0))
x++;

请问这两种语句有什么区别我在解决爱因斯坦阶梯问题时所用的是第一种运行解决为1显然是错的第二种是正确的请问有什么区别
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:52:00 | 显示全部楼层
与非逻辑我记得数电有公式
上面的必须全部不满足才可以
全部不等于才可以
下面的只要不满足一个就可以
只要有一个不等于就为0取反为1
回复

使用道具 举报

千问 | 2021-1-27 06:52:00 | 显示全部楼层
!(A&&B)等价于(!A||!B)
!(A||B)等价于(!A&&!B)
回复

使用道具 举报

千问 | 2021-1-27 06:52:00 | 显示全部楼层
引用2楼zhao4zhong1的回复:!(A&&B)等价于(!A||!B)
!(A||B)等价于(!A&&!B)

赞同
回复

使用道具 举报

千问 | 2021-1-27 06:52:00 | 显示全部楼层
感谢大佬们的回答
回复

使用道具 举报

千问 | 2021-1-27 06:52:00 | 显示全部楼层
与或区别,逻辑问题
回复

使用道具 举报

千问 | 2021-1-27 06:52:00 | 显示全部楼层
while(x%2!=1&&x%3!=2&&x%5!=4&&x%6!=5&&x%7!=0)
while(!(x%2==1&&x%3==2&&x%5==4&&x%6==5&&x%7==0))
这两个是不一样的,比如一旦x%2!=1为0,那0根谁&&都是0,所以就不会往下执行(也就是说不会去判断x%3!=2&&x%5!=4&&x%6!=5&&x%7!=0这些东西),
回复

使用道具 举报

千问 | 2021-1-27 06:52:00 | 显示全部楼层
首先要知道运算符的优先级和不同编译器的编译原理才能做,因为你的各个表达式都没加括号,不同的编译器出来结果可能不一样
回复

使用道具 举报

千问 | 2021-1-27 06:52:00 | 显示全部楼层
(1)while(x%2!=1&&x%3!=2&&x%5!=4&&x%6!=5&&x%7!=0)
x++;
X对2取余不为1,对3取余不为2,对5取余不为4,对6取余不为5和不能被7整除。当这些条件都满足的时候,X才会++。
(2)while(!(x%2==1&&x%3==2&&x%5==4&&x%6==5&&x%7==0))
x++;
X对2取余为1,对3取余为2,对5取余为4,对6取余为5和能被7整除。当这些条件都不满足的时候,X才会++。
而与的逻辑是,当第一个条件为假时,结果为假,后面的条件不进行运算,就算后面的条件为真也不进行运算。只有第一个为真时,按照从左到右的规则,继续判断。
所以,在(1)中,当X为2时,"x%2!=1"的运算结果为0,所以while将跳出循环。此时X的值为1(如果X的初值是1)
而在(2)中,当X为2时,“x%2==1”的运算结果也为0,但是有一个“!”在前面,所以while会继续循环,直到不满足while条件时才会退出循环。
以上是我的理解,不正确之处请指正。
回复

使用道具 举报

千问 | 2021-1-27 06:52:00 | 显示全部楼层
对楼上进行指正:
(2)while(!(x%2==1&&x%3==2&&x%5==4&&x%6==5&&x%7==0))
x++;
X对2取余为1,对3取余为2,对5取余为4,对6取余为5和能被7整除。当这些条件不满足其一的时候,X才会++。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行