javascript - 检查一个数的可整性的基本练习

标签 javascript

我被这个练习卡住了。我不明白为什么他们需要有第一个条件。我可以忽略那部分吗?
练习来自 https://www.w3resource.com/javascript-exercises/javascript-basic-exercise-46.php :

Write a JavaScript program to check two given non-negative integers that whether one of the number (not both) is multiple of 7 or 11.



function valCheck(a, b) {
  if (!((a % 7 == 0 || a % 11 == 0) && (b % 7 == 0 || b % 11 == 0))) {
    return ((a % 7 == 0 || a % 11 == 0) || (b % 7 == 0 || b % 11 == 0));
  } else
    return false;
}

console.log(valCheck(14, 21));
console.log(valCheck(14, 20));
console.log(valCheck(16, 20));

最佳答案

TL;DR – 不,这不是多余的!

Write a JavaScript program to check whether exactly one of the two given non-negative integer numbers is a multiple of 7 or 11.


为了解释为什么它不是多余的,让我们分解这个解决方案功能。
function valCheck(a, b) {
  if (!((a % 7 == 0 || a % 11 == 0) && (b % 7 == 0 || b % 11 == 0))) {
    return ((a % 7 == 0 || a % 11 == 0) || (b % 7 == 0 || b % 11 == 0));
  } else
    return false;
}
第一个条件
第一个条件是 !((a % 7 == 0 || a % 11 == 0) && (b % 7 == 0 || b % 11 == 0)) . x % n == 0表达式正在检查是否给定 x可以被 7 或 11 的(倍数)整除,但表达式写得过于冗长,有点难以理解。
使用 De Morgan's law ,我们可以重写它:
!((a % 7 == 0 || a % 11 == 0) && (b % 7 == 0 || b % 11 == 0))

⇔

!(a % 7 == 0 || a % 11 == 0) || !(b % 7 == 0 || b % 11 == 0)

⇔

(a % 7 != 0 && a % 11 != 0) || (b % 7 != 0 && b % 11 != 0)
现在,我们可以看出这个条件正在检查 a 的情况。或 b不能被 7 或 11 整除。
当这个条件为真时,我们返回第二个条件的结果。如果它是假的,那么我们知道输入不是 7 或 11 的倍数,所以我们直接返回假。
第二个条件
第二个条件是:
(a % 7 == 0 || a % 11 == 0) || (b % 7 == 0 || b % 11 == 0)
这个比第一个更不透明,并检查 4 个子条件中的任何一个是否为真(括号在这里无关紧要,因为它们都是“或”|| 运算符)。
由于我们已经从第一个条件中知道至少有一个输入不是 7 或 11 的倍数,所以我们现在可以简单地返回是否至少有输入是。换句话说,如果我们知道第二个条件为真,那么我们可以确定其中一个数字是 7 或 11 的倍数。
条件是否冗余?
所以回答你的问题,不,第一个条件不是多余的 ,因为它会检查是否至少有一个输入不是倍数或 7 或 11。我们需要两个条件表达式来正确检查输入之一是否是正确的倍数或 7 或 11。
如果“but not both”子句不存在,那么我们可以只使用第二个条件表达式,但既然是这样,我们就需要两条信息。

需要注意的是,我说我们需要两个表达式时撒了一点谎,因为确实可以用一个表达式来解决这个练习!

function valCheck(a, b) {
  return (a % 7 == 0 || a % 11 == 0) != (b % 7 == 0 || b % 11 == 0);
}

console.log(valCheck(14, 21)); // false
console.log(valCheck(14, 20)); // true
console.log(valCheck(16, 20)); // false

我会把它留给读者去弄清楚为什么会这样!

关于javascript - 检查一个数的可整性的基本练习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67994114/

相关文章:

javascript - 使用 Javascript 验证正则表达式

javascript - 调用 Cordova 模块?

javascript - 在 IE 中使用 setImmediate() 而不是 setTimeout(func,0)

javascript - 如何使用正确的引用 header 以编程方式导航到 url?

javascript - Jquery DOM 操作 还有比这更好的吗?

javascript - 如何使输入成为 View 的默认输入字段?

javascript - 如何在 chrome 中查看 devtools 源代码的 console.log 输出

javascript - ColorBox:Box Sizing 太小,仍有内容要显示

javascript - 使用 Node.js 操作 Mongoose/MongoDB 数组

javascript - Angular ng-view 无法与 Express 一起使用