題目
大數學家高斯有個好習慣:無論如何都要記日記。
他的日記有個與衆不同的地方,他從不注明年月日,而是用一個整數代替,比如:4210
後來人們知道,那個整數就是日期,它表示那一天是高斯出生後的第幾天。這或許也是個好習慣,它時時刻刻提醒着主人:日子又過去一天,還有多少時光可以用于浪費呢?
高斯出生于:1777年4月30日。
在高斯發現的一個重要定理的日記上标注着:5343,是以可算出那天是:1791年12月15日。
高斯獲得博士學位的那天日記上标着:8113
請你算出高斯獲得博士學位的年月日。
答案的格式是:yyyy-mm-dd, 例如:1980-03-21
解題思路
這是一個計算日期的題目,并不難,要注意判斷閏年,我是按照一年的天數依次進行疊加的,如果疊加的天數大于日記上的天數,那麼此時年份減一,确定了年份之後,從五月開始加每個月的天數,當疊加數大于日記天數時,月份減一(注意,我是從5月份開始加的,但是月份的數組下标是從0開始的,是以實際代碼裡面不需要要減一就可以确定月份),确定月份。特别注意12月份的特殊情況,此時跳出循環的年減一才是正确的年份,月份也要設定為12,然後就是用日記上的天數減去疊代器天數,确定天。注意出生那天,即1777年4月30日是第一天,是以算出來天以後還要減一。
答案
1799-7-16
代碼
#include<stdio.h>
int main()
{
int day_number=8113; //日記上記錄的天數
int year=1777; //年份,初始值為高斯生日的1777
int month=4; //月份 , 初始值為高斯生日的4月
int day; //天,
int n=0; //天數疊代器
int y=365; //記錄閏年、平年天數
int month_ping[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};//平年的每月天數
int month_run[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};//潤年的每月天數
// 先按照一年的天數來疊加,确定具體年份
while(n<day_number){
year++;
if((year%4 == 0 && year%100!=0 ) || year%400==0){ //判斷是否閏年
y=366;
n += y;
}
else{
y=365;
n += y;
}
}
n -= y; // 多加了一整年的天數,是以要減去年,此時的年份就可以确定了。
year--;
// 确定月份
while(n<day_number){
if((year%4 == 0 && year%100!=0 ) || year%400==0){
n += month_run[month];//注意數組下标從0開始,确定年份以後,從五月開始加天數。
month++;
}
else{
n += month_ping[month];
month++;
}
if(month == 12){
year++;
month=0;
}
}
//當月份為0時,跳出循環,則月份是上一年的12月。
if(month ==0){
month=12;
year--;
}
//将多加的一整個月的天數去掉,用日記上的天數減去疊代器n求和的天數,确定日期裡面的天數。
if((year%4 == 0 && year%100!=0 ) || year%400==0){
n -= month_run[month-1];
printf("month = %d\n",month);
}
else{
n -= month_ping[month-1];
}
day = day_number-n;
printf("%d-%d-%d\n",year,month,day-1); //注意出生那天也算,1777年4月30号是第一天,是以這裡天要減1.
return 0;
}
運作結果
