这个问题在这里已有答案:
对于学校项目,我需要计算闰年。问题是,我需要围绕int。
例如,有人出生于1961年。
double yearsbetween; yearsbetween = birthyear - 1918;
double leapyears; leapyears = ( yearsbetween / 4 );
如果birthyear = 1961
我得到leapyears = 10.75
,但那是错误的..我需要11岁。
如果答案是10.25,则需要四舍五入为10.如果答案是10.75,则需要四舍五入为11。
有人能帮我吗 ?
你必须特别注意每年检查闰年。由于存在一些例外情况,因此您认为每四年的跳跃是错误的:
它不是闰年,如果它可以被100整除而不能被400整除
例子:
假设我们只在闰年是那些年,而只有那些年可以被4整除的时期工作。
给定数n,小于或等于n的正数是4的倍数的是floor(n / 4)。设L(n)为该值,floor(n / 4)。
如果我们取m,那么从m到4的正倍数是L(m)。当我们减去L(n)时,结果L(m)-L(n)是大于n但小于或等于m的四的倍数。
因此,1918年到m年之间的闰年数是楼层(m / 4) - 楼层(1918/4)=楼层(m / 4) - 479.(如果基准年是闰年,我们想要将它包含在句子内而不是外面,我们可以用L(n-1)代替L(n)。
上述内容很容易扩展到更大的闰年模式。通过将L(n)改为floor(n / 4) - floor(n / 100)+ floor(n / 400),它变为n的正数,是4的倍数,但不是100的倍数,除非它们是400的倍数。然后L(m) - L(n)是n和m之间的跳跃规则的数量。
因此,该规则所涵盖的时期的适当公式是floor(n / 4) - floor(n / 100)+ floor(n / 400) - 464.使用C的整数运算,这很容易被评估为n/4 - n/100 + n/400 - 464
。
好像你需要的是std::ceil
您还可以在std::ceil
参考中找到其他舍入函数的链接,我建议您也浏览这些函数。
所以这是没有关系,直到c++20和我甚至不得不ask a question弄清楚如何使用chrono::year
。但是,如果可行的话,最好的解决方案是:
const chrono::year birthyear{ 1961 };
auto leapyears = 0;
for(chrono::year i{ 1918 }; i <= birthyear; ++i) {
if(i.is_leap()) {
++leapyears;
}
}
我通过live example的@HowardHinnant示例链接了this answer。