• 蓝桥杯 第四届C/C++预赛真题(1) 高斯日记(数学题,年份处理)


    题目标题: 高斯日记

    大数学家高斯有个好习惯:无论如何都要记日记。

    他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210

    后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?

    高斯出生于:1777年4月30日。

    在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。

    高斯获得博士学位的那天日记上标着:8113

    请你算出高斯获得博士学位的年月日。

    提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21

    请严格按照格式,通过浏览器提交答案。
    注意:只提交这个日期,不要写其它附加内容,比如:说明性的文字。


      数学题。

      这题不难,就是麻烦,考虑好细节,否则差了那么一两天这题就没分了。

      注意:出生那天也要算。

      解答1799-07-16

      代码(有些臃肿,主要是switch语句,可以用数组代替):

      1 #include <iostream>
      2 using namespace std;
      3 struct Date{
      4     int y,m,d;
      5 };
      6 bool run(int y)
      7 {
      8     if(y%100==0 && y%400==0)
      9         return true;
     10     if(y%4==0)
     11         return true; 
     12     return false;
     13 }
     14 Date f(Date birthday,int lastday)    //参数为出生日期和持续天数,输出lastday天之后的日期
     15 {
     16     int y = birthday.y;
     17     int m = birthday.m;
     18     int d = birthday.d;
     19     lastday--;    //出生那天也算
     20     int last  = lastday;
     21 
     22     while(last){    //剩余天数
     23         if(last==lastday){    //出生那年
     24             int rday=0;        //存储如果是闰年多出的那一天
     25             if(run(y)) ++rday;    //是闰年
     26             switch(m){
     27                 case 1:
     28                     last-=(31-d)+334+rday;
     29                     break;
     30                 case 2:
     31                     last-=(28+rday-d)+306;
     32                     break;
     33                 case 3:
     34                     last-=(31-d)+275;
     35                     break;
     36                 case 4:
     37                     last-=(30-d)+245;
     38                     break;
     39                 case 5:
     40                     last-=(31-d)+214;
     41                     break;
     42                 case 6:
     43                     last-=(30-d)+184;
     44                     break;
     45                 case 7:
     46                     last-=(31-d)+153;
     47                     break;
     48                 case 8:
     49                     last-=(31-d)+122;
     50                     break;
     51                 case 9:
     52                     last-=(30-d)+92;
     53                     break;
     54                 case 10:
     55                     last-=(31-d)+61;
     56                     break;
     57                 case 11:
     58                     last-=(30-d)+31;
     59                     break;
     60                 case 12:
     61                     last-=(31-d);
     62                     break;
     63                 default:break;
     64             }
     65             y++;
     66         }
     67         else if(run(y) && last>366){    //当前年份是闰年且剩余天数还有一年以上
     68             last-=366;
     69             y++;
     70         }
     71         else if(!run(y) && last>365){    //当前年份不是闰年且剩余天数还有一年以上
     72             last-=365;
     73             y++;
     74         }
     75         else{    //剩余天数不到1年
     76             int rday=0;        //存储如果是闰年多出的那一天
     77             if(run(y)) ++rday;    //是闰年
     78 
     79             if(1<=last && last<=31){    //1月
     80                 m=1;
     81                 d=last;
     82             }
     83             else if(32<=last && last<=59+rday){    //2月
     84                 m=2;
     85                 d=last-31;
     86             }
     87             else if(60+rday<=last && last<=90+rday){    //3月
     88                 m=3;
     89                 d=last-59-rday;
     90             }
     91             else if(91+rday<=last && last<=120+rday){    //4月
     92                 m=4;
     93                 d=last-90-rday;
     94             }
     95             else if(121+rday<=last && last<=151+rday){    //5月
     96                 m=5;
     97                 d=last-120-rday;
     98             }
     99             else if(152+rday<=last && last<=181+rday){    //6月
    100                 m=6;
    101                 d=last-151-rday;
    102             }
    103             else if(182+rday<=last && last<=212+rday){    //7月
    104                 m=7;
    105                 d=last-181-rday;
    106             }
    107             else if(213+rday<=last && last<=243+rday){    //8月
    108                 m=8;
    109                 d=last-212-rday;
    110             }
    111             else if(244+rday<=last && last<=273+rday){    //9月
    112                 m=9;
    113                 d=last-243-rday;
    114             }
    115             else if(274+rday<=last && last<=304+rday){    //10月
    116                 m=10;
    117                 d=last-273-rday;
    118             }
    119             else if(305+rday<=last && last<=334+rday){    //11月
    120                 m=11;
    121                 d=last-304-rday;
    122             }
    123             else if(335+rday<=last && last<=365+rday){    //12月
    124                 m=12;
    125                 d=last-334-rday;
    126             }
    127             last=0;
    128         }
    129     }
    130     Date date;
    131     date.y = y;
    132     date.m = m;
    133     date.d = d;
    134     return date;
    135 }
    136 int main()
    137 {
    138     Date birthday,date;
    139     birthday.y = 1777;
    140     birthday.m = 4;
    141     birthday.d = 30;
    142 
    143     int lastday = 8113;
    144     date = f(birthday,lastday);    //获得lastday天之后的日期
    145     cout<<date.y<<'-';
    146     if(date.m/10==0)
    147         cout<<'0'<<date.m<<'-'<<date.d<<endl;
    148     else
    149         cout<<date.m<<'-'<<date.d<<endl;
    150     return 0;
    151 }

    Freecode : www.cnblogs.com/yym2013

  • 相关阅读:
    【python】一个文件内容写入另一个
    【Linux】批量修改权限
    【Git】git add git commit
    赌博游戏
    输出斐波那契数列前20项,每输出5个数换行
    Java线程的几种可用状态
    Java创建线程的方式
    Java虚拟机
    判断对象oStringObject是否为String
    throw跟throws关键字
  • 原文地址:https://www.cnblogs.com/yym2013/p/3605655.html
Copyright © 2020-2023  润新知