当前位置:   article > 正文

【蓝桥杯】日期类问题详解_蓝桥杯日期问题

蓝桥杯日期问题

目录

1 判断某年是否是闰年

2 求指定日期是星期几

3 求日期A到日期B有多少天


1 判断某年是否是闰年

       日期类问题常常涉及对闰年的判断:年份是4的倍数的,一般都是闰年;但年份是整百数的,必须是400的倍数才是闰年。

  1. bool run(int y){
  2. return (y%100 && y%4 == 0)||(y%400==0);
  3. }

有了闰年的判断方法,我们才可以进一步解决日期类问题。

2 求指定日期是星期几

        第一种方法是死记硬背的公式(不大推荐这种方法,个人推荐第二种方法!!!)——基姆拉尔森计算公式:对于 y 年 m 月 d 日,有:

  1. int fun(int y,int m,int d)
  2. {
  3. int w;
  4. if(m<=2) m += 12,y--;
  5. w = (y + y/4 + y/400 - y/100 + 2*m + 3*(m+1)/5 +d)%7;
  6. return w;
  7. }
  8. // 其中,w的值为[0,6],分别对应星期一到星期日,即0表示星期一,6表示星期日。

        第二种是一个比较好记忆、适用范围更广的方法:从公元1年1月1日,到给定日期,一共有多少天,然后总天数取模7即可。注意:1~6代表星期一到六,0代表星期

  1. int mouth[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
  2. bool run(int y){
  3. return (y%100 && y%4 == 0)||(y%400==0);
  4. }
  5. int howmany(int y,int m,int d){
  6. int ret = 0;
  7. for(int i = 1;i<y;i++)
  8. ret += run(i)?366:365;
  9. for(int i = 1;i<m;i++){
  10. if(run(y)&&i==2) ret++;
  11. ret += mouth[i];
  12. }
  13. ret += d;
  14. return ret;
  15. }

3 求日期A到日期B有多少天

        我们当然可以对日期A进行累加,统计从A到B一共要加多少次,但日期进行加减有很多细节要注意,一不留神可能就要debug了。我们可以借助前面提到的方法,计算出两个日期各有多少天,再做差。

  1. // 日期A:y1,m1,d1
  2. // 日期B:y2,m2,d2
  3. printf("%d\n",howmany(y2,m2,d2)-howmany(y1,m1,d1));

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/929665
推荐阅读
相关标签
  

闽ICP备14008679号