首页 > 解决方案 > 闰年功能;这个解决方案是如何工作的?

问题描述

问题是这样的:

给定一年,报告它是否是闰年。

这里的棘手之处在于公历中会出现闰年:

on every year that is evenly divisible by 4
  except every year that is evenly divisible by 100
    unless the year is also evenly divisible by 400

我的解决方案(有效)是这样的:

export const isLeap = (year) => {
    const yearModFour = (year % 4) === 0 
    const yearModHundred = (year % 100) === 0
    const yearModFourHundred = (year % 400) === 0 
    const isLeapYear = yearModFour === yearModHundred === yearModFourHundred
    return isLeapYear
}

我得出这个结论是因为我错过了以下逻辑:

on every year that is evenly divisible by 4
  and also evenly divisible by 100
    and also evenly divisible by 400

我的问题是,为什么这会起作用?

我不知道为什么我不使用 && 操作数,但话又说回来,它不会那样工作

标签: javascriptequalityboolean-logic

解决方案


让我们看一下谓词yearModFour === yearModHundred === yearModFourHundred,并列出一些会导致所有可能性的数字。

对于第 1 年,谓词计算为:

(False === False) === False
             True === False
                 False

对于第 4 年,谓词评估为:

(True === False) === False
           False === False
                 True

对于第 100 年,谓词评估为:

(True === True) === False
           True === False
               False

对于 400 年,谓词计算为:

(True === True) === True
           True === True
                True

现在这就是所有可能性,这里不会有任何其他可能性。这是因为任何能被 400 整除的数都可以被 100、4 和 1 整除;任何可被 100 整除的都可以被 4 和 1 整除;等等。

所以你的结论并不完全正确,因为它暗示了所有模运算之间的逻辑“与”。


推荐阅读