为了找到闰年,为什么年份必须不能被100整除且能被400整除?
我知道年份必须能被4整除。请解释一下算法。
一年的长度大约是365.242196天,因此我们必须减去大约四分之一天才能适配:
365.242196 - 0.25 = 364.992196(每四年加一天):但糟糕的是,现在它太小了!让我们少加一天来修正一百年中的一次(即每四百年)。
364.992196 + 0,01 = 365.002196 (哎呦,有点大了,不过还是加上那一天吧,一般每四百年加一次)。
365.002196 - 1/400 = 364.999696
现在基本没问题了,只需要偶尔调整闰秒就行。
(注意:在这一步骤之后不再应用更正的原因是因为一年的长度也会变化!这就是为什么闰秒是最灵活的解决方案,例如可以看这里)
我想就是这样啦。
在维基百科上有一个算法用于确定闰年:
function isLeapYear (year):
if ((year modulo 4 is 0) and (year modulo 100 is not 0))
or (year modulo 400 is 0)
then true
else false
有关闰年的许多信息都可以在维基百科关于闰年的页面上找到,其中包括不同日历的详细信息。
一般而言,计算闰年的算法如下...
如果年份能够被4整除但不能被100整除,则为闰年。如果年份既能被4整除又能被100整除,则不是闰年,除非它也能被400整除。
因此,像1996年、1992年、1988年等年份都是闰年,因为它们能够被4整除但不能被100整除。对于世纪年,400规则很重要。因此,尽管世纪年1900年、1800年和1700年仍然能够被4整除,但它们恰好能够被100整除,而且它们不能进一步被400整除,所以它们不是闰年。
这已足以检查一年是否为闰年。
if( (year%400==0 || year%100!=0) &&(year%4==0))
cout<<"It is a leap year";
else
cout<<"It is not a leap year";
a) 一年有365.242199天。
b) 如果每年都是365天,那么在100年中我们将会损失24.2199天。这就是为什么在每个世纪末,我们要加上24天(每4年一次,除了能被100整除的年份)。
c) 然而,每个世纪我们还是会损失0.21299天。所以在四个世纪中,我们将会损失0.8796天。这就是为什么在每四个世纪末,我们会加上1天(每四个世纪中,我们会算一个闰年)。
d) 但是这意味着我们在四个世纪中会损失-0.1204天(我们要向前走)。因此,在8个四百年周期(3200年)中我们不会算一个闰年。
e) 这也意味着在3200年中,我们将会损失0.0368天。所以在24x3200年(=76800年)中,我们将会损失0.8832天。这就是为什么我们需要算一个闰年。
等等……(到那时我们可能已经毁掉了这个星球,所以这也无关紧要了)。
然而,我不明白的是为什么我们不是每500年算一个闰年而是每400年。这样我们会更快地逼近正确的时间(每500年我们将会损失2.3小时)。
这是一个简单的实现维基百科算法,使用JavaScript三元运算符:
isLeapYear = (year % 100 === 0) ? (year % 400 === 0) : (year % 4 === 0);
if
语句效率低。即使一个比较就足够了,在每种情况下你都强制进行两次比较。在正态分布数据集上执行的计算将有75%的概率无法通过 % 4
测试,因此你应该首先进行测试,如果为假则立即退出。 - Anthonyvar isleap = !(year%4) && (!!(year%100) || !(year%400));
or if you prefer:var isleap = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
- Quinn Dirks如果输入的年份是闰年,则返回true。
基本的现代代码:
If year mod 4 = 0, then leap year
if year mod 100 then normal year
if year mod 400 then leap year
else normal year
今天的规则始于公元1582年,朱利安历法规则每4年开始于公元前46年,但在公元10年之前并不连贯,这是由凯撒宣布的。然而,在此之前的某些年份,他们会每隔3年添加一些闰年:
因此,闰年是公元前45年、42年、39年、36年、33年、30年、27年、24年、21年、18年、15年、12年、9年、8年和12年。在公元前45年之前不会添加闰年。
由于存在...2BC 1BC 1AD 2AD...的计算问题,所以不存在公元0年。
function isLeapYear(year: Integer): Boolean;
begin
result := false;
if year > 1582 then // Todays calendar rule was started in year 1582
result := ((year mod 4 = 0) and (not(year mod 100 = 0))) or (year mod 400 = 0)
else if year > 10 then // Between year 10 and year 1582 every 4th year was a leap year
result := year mod 4 = 0
else //Between year -45 and year 10 only certain years was leap year, every 3rd year but the entire time
case year of
-45, -42, -39, -36, -33, -30, -27, -24, -21, -18, -15, -12, -9:
result := true;
end;
end;
如果我们再向前迈进一步,不会更好吗? 假设每3200年为非闰年, 那么一年的长度将会变得
364.999696 + 1/3200 = 364.999696 + .0003125 = 365.0000085
之后大约120000年后将需要进行调整。