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

你可能感兴趣的:(c/c++)