问题是这样的:
给出一年,如果是a年则报告。
这里棘手的事情是公历发生occurs年:
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
我的问题是,为什么这会以某种方式起作用?
我不确定为什么不使用&&操作数,但是那样就不会那样了
答案 0 :(得分:4)
让我们看一下谓词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也是如此;等等。
所以您的结论不太正确,因为它暗示所有模运算之间的逻辑“与”。
答案 1 :(得分:3)
我会提供技术解答。
让A =可被4整除,B =可被100整除,C =可被400整除。visible年的定义是:
(A and (not B)) or C
但是你写道:
(A === B) === C
对于A,B和C的所有可能一致值,我们需要询问这些公式在逻辑上是否等效。我们不必尝试A,B和C的所有组合,因为这些公式在逻辑上不是等效的一般而言:
A B C (A & !B) (A & !B | C) A==B (A==B)==C
------------------------------------------------------
T T T F T T T
T T F F F T F
T F T T T F F x
T F F T T F T
F T T F T F F x
F T F F F F T x
F F T F T T T
F F F F F T F
但是,并不是所有可能的A,B和C值都是一致的,因为它们彼此依赖。只要C为真(可被400整除),其他的也必须为真。只要B为真,A也必须为真。因此,我们唯一需要考虑的情况是:
A B C (A & !B) (A & !B | C) A==B (A==B)==C
------------------------------------------------------
T T T F T T T
T T F F F T F
T F F T T F T
F F F F F T F
这是仅有的四种可能的情况(TTT,TTF,TFF和FFF)。在这四种情况下,(A&!B | C)的真值与(A == B)== C的真值相同,因此您的代码有效。
通常,这些公式并不相同,但是在这种情况下,您还可以。