蓝桥杯 日期计算
算法提高 日期計算 ? 時間限制:1.0s ? 內存限制:256.0MB ???? 問題描述 已知2011年11月11日是星期五,問YYYY年MM月DD日是星期幾?注意考慮閏年的情況。尤其是逢百年不閏,逢400年閏的情況。 輸入格式 輸入只有一行
YYYY MM DD 輸出格式 輸出只有一行
W 數據規模和約定 1599 <= YYYY <= 2999
1 <= MM <= 12
1 <= DD <= 31,且確保測試樣例中YYYY年MM月DD日是一個合理日期
1 <= W <= 7,分別代表周一到周日 樣例輸入 2011 11 11 樣例輸出 5
1.找到一個參照,題中可知2011/11/11為周五,所以2011/11/13為周日,取2011/11/13參照,因為這樣更好算。
?2.分析可知總共有如下幾種情況:
1.年份大于2011
2.年份小于2011
3.年份等于2011(日期又分為比11/13大的和小于等于11/11的)
?3.分情況寫出代碼,主要是日期總數的計算容易出錯,其中包括閏年的判斷。
個人水平有限,寫的代碼有點長,以后有能力希望能簡化,多多指教
<span style="font-size:18px;">/*Name: 計算日期 Copyright: Author: styDate: 15/2/9 14:23Description:題目不難,就是有點繁瑣,容易出錯 */#include<stdio.h>//判斷該日期為該年中的第多少天 int count(int year, int month, int day) {int sum = 0;int a[][12] = {{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};int b = 0;if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)){b = 1;}sum = day;for (int i = 0; i < month - 1; i++){sum += a[b][i];}return sum; }void fun1(int year, int month, int day) {int sum = 0;int date = 7;int i;sum = count(2011, 12, 31) - count(2011, 11, 13);for (i = 2012; i < year; i++){sum += count(i, 12, 31); }sum += count(year, month, day); //得到總天數int temp = sum % 7; if (temp == 0){date +=temp;}else{date = (date + temp) % 7;}printf("%d\n", date); }void fun2(int year, int month, int day) {int sum = 0;int i;int date = 7;sum = count(2011, 11, 13);for (i = 2010; i > year; i--){sum += count(i, 12, 31); }sum += (count(year, 12, 31) - count(year, month, day)); //得到總天數int temp = sum % 7;//printf("ad\n");if (temp == 0){date +=temp;}else{date = 7 - (date + temp) % 7; //注意此處用7減去}printf("%d\n", date); }int main() {int year, month, day;int sum = 0;int i, j;int date = 7;int temp;scanf("%d%d%d", &year, &month, &day);//計算大于2011年的日期if (((year > 2011) && (year <= 2999)) && ((month >= 1) && (month <= 12)) && ((day >= 1) && (day <= 31))){fun1(year, month, day);}//計算小于2011年的日期if (((year >= 1599) && (year < 2011)) && ((month >= 1) && (month <= 12)) && ((day >= 1) && (day <= 31))){fun2(year, month, day);}//計算等于2011年的,又可以分成兩部分if ((year == 2011) && ((month >= 1) && (month <= 12)) && ((day >= 1) && (day <= 31))){if (month >= 11 && day >= 13){sum = count(year, month, day) - count(2011, 11, 13);temp = sum % 7;if (temp == 0){date +=temp;}else{date = (date + temp) % 7;}printf("%d\n", date);}else{sum = count(2011, 11, 13) - count(year, month, day);temp = sum % 7;if (temp == 0){date +=temp;}else{date = 7 - (date + temp) % 7; //注意此處用7減去}printf("%d\n", date);}}return 0; }</span> 最后帶入相應區間的數進行檢驗十分有必要
總結
- 上一篇: Windows Live SkyDriv
- 下一篇: /T3软件库存核算模块业务操作