日期問題難度并不大,但是代碼量非常大,需要較高的熟練度,因此需要著重練習,主要涉及數組和循環兩個方面的知識點,需要熟練的測試代碼。
兩個經典題型
閏年
閏年滿足以下兩個條件的任意一個
- 能夠被400整除
- 不能夠被100整除,并且能夠被4整除
year%400||year%100&&year%4
給定月份判斷天數
定義一個數組month[13]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},可以通過空間換時間,只要將月份作為數組序號,返回數組值即可。
題目:某年的第幾日
解題思路
方案一(代碼簡潔,不通用)
- 先算到該月的頭一天是該年的第幾天
- 再算今天是該月的第幾天
- 上述兩個值加起來即為今年的第幾天
代碼
#include <cstdio>
int main() {int year, month, day;int month_Day[13]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int total_day[13]={0};for (int mon = 2; mon < 13; ++mon) {//到mon月1日的天數 = 到mon-1月1日的天數+第mon-1月的天數total_day[mon] = total_day[mon-1] + month_Day[mon-1];}while(scanf("%d%d%d", &year, &month, &day) != EOF){//如果是閏年bool isLeap = year%400==0||year%100!=0&&year%4==0;if (isLeap== true&& month>=3){printf("%d\n",total_day[month]+day+1);} else{printf("%d\n",total_day[month]+day);}}return 0;
}
方案二(通用解決方案:next day)
一天天往后迭代,直到算到所要的日期
示例:
輸入:
2000 3
2000 31
2000 40
2000 60
2000 61
2001 60
輸出:
2000-01-03
2000-01-31
2000-02-09
2000-02-29
2000-03-01
2001-03-01
#include <cstdio>
int main() {int year, n;int month_Day[13]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};while(scanf("%d%d",&year,&n)!=EOF){int mon = 1;int day = 1;for (int i = 0; i < n-1; ++i) {bool isLeap = year%400==0||year%100!=0&&year%4==0;if (isLeap){month_Day[2]=29;} else{month_Day[2]=28;}++day;if (day > month_Day[mon]){//日子超過了當月的天數++mon;day=1;if (mon>12){//過年了mon = 1;++year;}}}printf("%04d-%02d-%02d\n",year,mon,day);}return 0;
}
%4d與%04d的區別:
- %4d:至少4位10進制數,不足用空格補
- %04d:至少4位10進制數,不足用0補