赞
踩
目录
日期类问题常常涉及对闰年的判断:年份是4的倍数的,一般都是闰年;但年份是整百数的,必须是400的倍数才是闰年。
- bool run(int y){
- return (y%100 && y%4 == 0)||(y%400==0);
- }
有了闰年的判断方法,我们才可以进一步解决日期类问题。
第一种方法是死记硬背的公式(不大推荐这种方法,个人推荐第二种方法!!!)——基姆拉尔森计算公式:对于 y 年 m 月 d 日,有:
- int fun(int y,int m,int d)
- {
- int w;
- if(m<=2) m += 12,y--;
- w = (y + y/4 + y/400 - y/100 + 2*m + 3*(m+1)/5 +d)%7;
- return w;
- }
- // 其中,w的值为[0,6],分别对应星期一到星期日,即0表示星期一,6表示星期日。
第二种是一个比较好记忆、适用范围更广的方法:从公元1年1月1日,到给定日期,一共有多少天,然后总天数取模7即可。注意:1~6代表星期一到六,0代表星期
- int mouth[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
- bool run(int y){
- return (y%100 && y%4 == 0)||(y%400==0);
- }
-
- int howmany(int y,int m,int d){
- int ret = 0;
- for(int i = 1;i<y;i++)
- ret += run(i)?366:365;
- for(int i = 1;i<m;i++){
- if(run(y)&&i==2) ret++;
- ret += mouth[i];
- }
- ret += d;
- return ret;
- }

我们当然可以对日期A进行累加,统计从A到B一共要加多少次,但日期进行加减有很多细节要注意,一不留神可能就要debug了。我们可以借助前面提到的方法,计算出两个日期各有多少天,再做差。
- // 日期A:y1,m1,d1
- // 日期B:y2,m2,d2
- printf("%d\n",howmany(y2,m2,d2)-howmany(y1,m1,d1));
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。