我知道有更好、更有效的解决方案来检查哪一年是闰年。但我是一个初学者,我很好奇,尽管我的代码效率低下,但它是否仍然执行解决方案并且其逻辑没有缺陷?
这是确定特定年份是否为闰年的方法:
如果一年能被 4 整除,则为闰年;
除非该年份也能被 100 整除;
除非该年份也能被 400 整除。
我的解决方案:
function isLeap(year) {
if (year % 4 === 0 && year % 100 != 0) {
return "Leap year.";
}
if (year % 4 === 0 && year % 100 != 0 && year % 400 === 0) {
return "Leap year.";
}
if (year % 4 === 0 && year % 100 != 0 && year % 400 != 0) {
return "Not leap year.";
}
else {
return "Not leap year.";
}
}
最佳答案
在您的代码中,您分别有 3 个 if 语句。第三个 if 语句,无论结果如何,都会记录“不是闰年”,因此 year % 400 !=0
是一个多余的检查,因为如果删除,它仍然会属于else
比较。
这意味着我们可以将所有不是闰年的内容放入 else
中并消除 if 语句,使代码如下所示。
if (year % 4 === 0 && year % 100 != 0) {
return "Leap year.";
}
if (year % 4 === 0 && year % 100 != 0 && year % 400 === 0) {
return "Leap year.";
}
else {
return "Not leap year.";
}
如果我们查看其余的 if 语句,我们可以看到前 2 个比较是相同的,并且我们可以选择检查 year % 400 === 0
。
但是,根据您的 3 条规则,第 3 条规则规定:
除非那一年也能被 400 整除。
因此,我们可以假设,如果它能被 400 整除,那么它就是一个有保证的闰年,并且我们有语句 year % 400 === 0
确保这一点。然后我们使用 OR 运算符 ||
。这意味着,如果我们得到可以被 400 整除的年份,我们总是返回闰年,而不管其他 2 条规则如何。
但是,如果它不能被 400 整除,我们就剩下 2 个比较 year % 100 != 0 &&year % 4 === 0
。如果这两者都成立,并由 AND 运算符 &&
强制执行,那么这也是闰年。这将为您留下以下 if 语句。
if (year % 400 === 0 || year % 100 !== 0 && year % 4 === 0) {
return "Leap year.";
}
else {
return "Not leap year.";
}
此时,您可以说年份要么为真,要么符合闰年的规则而进入 if 语句。这意味着我们可以删除 else
并只包含一个 if 语句和一个额外的返回值,如果使用有效的闰年调用该函数,则永远不会达到该返回值。
if (year % 400 === 0 || year % 100 !== 0 && year % 4 === 0) {
return "Leap year.";
}
return "Not leap year.";
关于javascript - 闰年解决方案检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73712418/