天天看點

藍橋杯真題練習——高斯日記

題目

大數學家高斯有個好習慣:無論如何都要記日記。

他的日記有個與衆不同的地方,他從不注明年月日,而是用一個整數代替,比如: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;
}
           

運作結果

藍橋杯真題練習——高斯日記

繼續閱讀