对于一个学校项目,我需要计算the年。问题是,我需要对整数进行四舍五入。
例如某人出生于1961年。
double yearsbetween; yearsbetween = birthyear - 1918;
double leapyears; leapyears = ( yearsbetween / 4 );
如果birthyear = 1961
我得到leapyears = 10.75
,但这是错误的。我必须是11岁。
如果答案为10.25,则需要四舍五入为10。如果答案为10.75,则需要四舍五入为11。
有人可以帮助我吗?
答案 0 :(得分:2)
您必须专门查看每年以检查leap年。您认为第4年是飞跃是错误的,因为有一些例外情况:
如果它可以被100整除而不能被400整除,则它不是a年。
示例:
答案 1 :(得分:1)
假设我们只在a年是那些可以被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 年的of年数是下限( m / 4)-下限(1918/4)=下限( m / 4)-479。(如果基准年是a年,并且我们希望将其包括在期间内而不是外部,则可以将L( n )替换为L( n ) n −1)。
以上内容很容易扩展到较大的leap年模式。通过将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 < / em> / 400)-464。使用C的整数算法,可以很容易地将其评估为n/4 - n/100 + n/400 - 464
。
答案 2 :(得分:0)
好像您需要的是std::ceil
我建议您在std::ceil
参考中也有指向其他舍入函数的链接。
经历那些。
答案 3 :(得分:0)
因此,这直到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。