计算两个日期相差的天数----非常妙的做法
作者:
灰小白
,
2022-04-16 20:42:03
,
所有人可见
,
阅读 439
时间转换为从(假设1-1-1是年份的起始)到 yyyy–mm–dd 一共多少天。
另外提供了一种很妙(我觉得哈)的计算总和的方法。
// 转换为前缀和,这样就不用一个一个加了
int months[13] = {0 , 30 ,28, 31, 30 ,31 ,30 ,31 ,31 , 30 ,31 ,30 ,31} ;
// 判断闰年
bool check(LL y){
if((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) return true;
return false;
}
// 获取总天数
LL allDay(LL y, LL m, LL d){
LL res = 0 ;
// 计算的时候把 y 年的平闰也计算了。如果 y 是闰年,并且月数小于 3 则要减 1 。大于等于 3 则无影响
if(check(y) && mm <= 2) res = -1;
// (y - 1) * months[12] : 1 - y - 1 年的总天数 。
// y/4 - y/100 + y/400 + res : 最妙的, y/4 总个数 - y/100 不符合要求的(因为把 y/400
// 的也减去了) + y/400
// months[m - 1] 记得是 m - 1 ,不是 m 。别忘了加上天数 d 。
res =(y - 1) * months[12] + y/4 - y/100 + y/400 + res + months[m - 1] + d ;
return res;
}
orz,当时新生赛写的时候考虑到了诸如m-1,前缀和等细节问题,苦于判断闰年数量,写了大量繁复的判断,诸如先判断百年再判断其他,实在过于繁琐,细节也非常多,最后还没能写出来,看到这个计算从1-1-1的起始总天数,判断闰年的方法茅舍顿开
我也是昨天比赛看别人写的,觉得太妙了就抄下来了。