蓝桥杯 第四届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

posted @ 2014-03-17 18:14  Freecode#  阅读(535)  评论(1编辑  收藏  举报