第一題:根據一年中的第
n
天計算日期📌 知識點
判斷閏年:
- 閏年條件:能被
400
整除,或 能被4
整除但不能被100
整除。- 平年:2 月 28 天;閏年:2 月 29 天。
累加月份,找到
n
屬于哪個月:
- 定義
day[]
數組,存儲 1~12 月的天數(默認 28 天的 2 月)。- 遍歷
day[]
,n > day[i]時候,
減少n
,找到n
歸屬于哪個月。格式化輸出
yyyy-MM-dd
:
- 月份 & 日期小于 10 時補
0
,保證輸出格式。
?? 代碼注意點
? 閏年判斷 → 修改
day[1] = 29
(二月改為 29 天)。
? 使用while(n > day[i])
遍歷day[]
數組,逐步減少n
,找到具體的月份
&日期
。
? 輸出格式化 →printf("%04d-%02d-%02d\n", y, month, day);
確保補0
。
📌 第二題:求輸入日期的后一天
📌 題目考點
處理多組輸入
- 第一行輸入
m
(表示m
組測試數據)。- 接下來
m
行,每行有 3 個整數:yyyy mm dd
(表示 年份、月份、日期)。月份天數處理
- 定義
day[]
數組,存儲 1~12 月的天數(默認 不考慮閏年)。- 如果
day+1 > 當前月天數
,說明 需要進位到下個月。- 如果
month+1 > 12
,說明 需要進位到下一年。格式化輸出
yyyy-MM-dd
- 月份 & 日期小于 10 時補
0
,確保符合yyyy-MM-dd
標準格式。
📌 代碼注意點
? 處理多組輸入 → 使用
while (m--)
讀取m
組數據。while(m--){cin<<x<<y}
? 使用day[]
數組存儲每月天數,確保正確計算日期。
? 如果day+1 > d[month-1]
,進入下個月;如果month > 12
,進入下一年。
? 格式化輸出yyyy-MM-dd
,保證補0
。
題目一
- 給出年份
y
和一年中的第n
天,計算n
天是 幾月幾號。
輸入描述
- 輸入包含 兩個整數:
y
:年份(1 ≤ y ≤ 3000
)n
:一年中的第n
天(1 ≤ n ≤ 366
)
-
#include <iostream> using namespace std; //日期類 int main(){int y,n;while(cin>>y>>n){//判斷閏年// 定義每個月的天數(默認為平年)int day[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; if(y>=1&&y<=3000&&n>=1&&n<=365){// 判斷是否為閏年,修改二月天數if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)) {day[1] = 29;}int i =0;while(n>day[i]){n=n-day[i];i++;}//cout<<y<<"-"<<i+1<<"-"<<n;// 格式化輸出:yyyy-MM-DD(月份和日期小于 10 時前面補 0)printf("%04d-%02d-%02d\n", y,i+1, n);}return 0; } }
題目二
📌 題目描述
-
輸入
- 第一行輸入
m
(表示有m
組測試數據)。 - 接下來的
m
行,每行包含 3 個整數:yyyy mm dd
(分別表示 年份、月份、日期)。 - 保證測試數據不會有閏年。
- 第一行輸入
-
輸出
- 輸出
m
行,每行表示輸入日期的后一天,格式為yyyy-mm-dd
。
- 輸出
📌 示例
輸入
2
1999 10 20
2001 1 31
輸出
1999-10-21
2001-02-01
#include <iostream>
using namespace std;
//日期類
int main(){int m;int y,month,day;cin>>m;while(m--){cin>>y>>month>>day;// 定義每個月的天數(默認為平年)int d[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};if(y>=1&&y<=3000&&day>=1&&day<=365){if(day+1>d[month-1]){month+=1;day =1;if (month>12){month=1;y++;}}}else{day+=1;}//cout<<y<<"-"<<i+1<<"-"<<n;// 格式化輸出:yyyy-MM-DD(月份和日期小于 10 時前面補 0)printf("%04d-%02d-%02d\n", y,month, day);}return 0;
}