【问题标题】:What does `!((n % 5 != 0) || (n % 20 == 0))` trasnform into? and why? I don't seem to get it [closed]`!((n % 5 != 0) || (n % 20 == 0))` 会变成什么?为什么?我似乎没有得到它[关闭]
【发布时间】:2020-08-31 02:28:39
【问题描述】:

标题。我需要知道!((n % 5 != 0) || (n % 20 == 0)) 转换成什么以及为什么。我说转换是因为它的开头有 !

我尝试将其转换为 ((n%5==0) || (n%20==0)),但我很确定这不是正确的答案。

谢谢!!

【问题讨论】:

  • 查看德摩根定律。应该是((n%5==0) && (n%20!=0))
  • 这感觉像是一项任务...如果我将您指向 De Morgan's laws 会有帮助吗?

标签: c++ if-statement logical-operators modulo


【解决方案1】:

否定比看起来更难。

如果 A 和 B 中至少有一个为真,则“A 或 B”为真。

因此,如果 A 和 B 都不为真,则它的否定“非(A 或 B)”一定为真,这与 A 和 B 都为假是一样的。

即否定等价于“(not A) and (not B)”。

这会将您带到!(n % 5 != 0) && !(n % 20 == 0)(n % 5 == 0) && (n % 20 != 0)

这是德摩根定律之一,您可以记住它,但您自己“发现”并不难,您只需要记住将操作和操作数“反转”即可。

【讨论】:

    【解决方案2】:

    原文:!((n % 5 != 0) || (n % 20 == 0))

    应用德摩根定律:(!(n % 5 != 0) && !(n % 20 == 0))

    使其更清晰(假设n 类似于int 并且运算符没有重载):
    ((n % 5 == 0) && (n % 20 != 0))

    现在你有结果了。

    【讨论】:

      【解决方案3】:

      假设您的意思是使用DeMorgan's Law,您可以通过对每个表达式进行 NOT 运算并将 OR 翻转为 AND(反之亦然)来将 NOT 分配到表达式中。

      所以

      !((n % 5 != 0) || (n % 20 == 0))
      

      可以变成

      (!(n % 5 != 0) && !(n % 20 == 0))
      

      可以变成什么

      ((n % 5 == 0) && (n % 20 != 0))
      

      【讨论】:

      • 非常感谢!所以它变成(!(n % 5 != 0) && !(n % 20 == 0)) 因为! 在括号之外,对吗?我的意思是,如果是(!(n % 5 != 0) || (n % 20 == 0)),那应该是((n%5==0) || (n%20==0)),对吧?
      • 看起来是对的,是的@jake。但是由于 NOT 一直在括号之外,因此您必须将其分发给所有内容。
      • 我知道我不应该评论谢谢。但谢谢。很多
      • a > b 的对立面将是 a <= b,这就是你在这里缺少的 @jake ;)
      • 正是@Jake。因为a < ba >= b 的任何情况下都会评估为假。
      猜你喜欢
      • 2020-03-06
      • 2020-03-19
      • 2023-03-06
      • 2016-07-05
      • 2015-05-04
      • 2011-01-19
      • 2018-04-14
      • 1970-01-01
      • 2021-02-12
      相关资源
      最近更新 更多