這是《C++算法寶典》算法篇的第09節文章啦~
如果你之前沒有太多C++基礎,請點擊👉專欄:C++語法入門,如果你C++語法基礎已經爐火純青,則可以進階算法👉專欄:算法知識和數據結構👉專欄:數據結構啦
目錄
?前言
📕得到某年某月的天數
🧠普通閏年
🧠世紀閏年
📕得到某年某月的天數
📕判斷日期的合法性
📕訓練:第n天的日期
🧠第n天的日期參考代碼
📕訓練:日期距離
🧠日期距離參考代碼
前言
無論是中小學編程競賽還是大學生編程競賽,日期模擬都是經常會出現的題目。
日期模擬經常會出現以下題型:
- 得到某年某月的天數
- 判斷給定日期的合法性
- 給定年份,求這一年第n天的日期
- 給定年月日,求經過n天后的日期
- 查找兩個日期之間有多少個回文日期... ...
得到某年某月的天數
得到某年某月的天數問題經常會作為其他問題的模板來使用。
首先我們需要存儲一年中所有月份相對應的天數
int day[] = {0,31,28,31,30,31,30,31,31,30,31,30,31}
其中day[1]表示一月份最多31天,2月份先賦值為28天,具體天數還需要檢測年份是否是閏年,如果是閏年還需要+1天
閏年分為兩種:
普通閏年
年份是4的倍數,但不是100的倍數,例如2004、2020年等
世紀閏年
是400的倍數,例如1900不是世紀閏年,2000是世紀閏年,即:
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)是閏年;else不是;
得到某年某月的天數
當月份不是2月時,就返回指定當前月份初始天數
當月份是2月時,判斷年份是否是閏年,當年份為閏年成立時,leap值為1,不成立時值為0,初始天數加上leap的值即為2月份天數
int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};// 得到某年某月的天數int check(int y, int m){if(m != 2) return days[m];else{//特判 2 月int leap = (y % 4 == 0 && y % 100 != 0 || y % 400 == 0);return days[m] + leap;}}
判斷日期的合法性
一般這樣的題型會先給你一個格式,看是否符合這個格式,比如要滿足20230701這樣的格式才是合法的。
首先你需要分離出年份,再分離出月份,最后分離出日。
再分別判斷年月日是否符合題意
if(m<1||m>12) 則月份不符合if(d<1||d>(指定月份的總天數)) 則日不符合
注:年份一般不需要檢查,但也要視題意而定
訓練:第n天的日期
給定一個年份y和一個整數d,問這一年的第d天是幾月幾日?注意閏年的2月有29天。滿足下面條件之一的是閏年:
1、年份是4的整數倍,而且不是100的整數倍;
2、年份是400的整數倍。
【輸入描述】輸入的第一行包含一個整數y,表示年份,年份在1900到2015之間(包含1900和2015)。
輸入的第二行包含一個整數d,d在1至365之間。
【輸出描述】輸出兩行,每行一個整數,分別表示答案的月份和日期。
【樣例輸入1】
2015
80
【樣例輸出】
3
21
第n天的日期參考代碼
#include <iostream>
using namespace std;
int day[13]={0,31,0,31,30,31,30,31,31,30,31,30,31};
bool check(int n) ?//判斷閏年
{if(n%400==0||(n%4==0&&n%100!=0)) return true;return false;
}
int main()
{int m,n;cin>>m>>n;if(check(m)) ?day[2]=29;else ?day[2]=28;for(int j=1;j<=12;j++){n-=day[j];if(n<0){cout<<j<<endl<<day[j]+n;break;}if(n==0){cout<<j<<endl<<day[j];break;}}return 0;
}
訓練:日期距離
?輸入一個的日期,輸出它和2014年5月17日相差有多少天?注意閏年的2月有29天。滿足下面條件之一的是閏年:
1、年份是4的整數倍,而且不是100的整數倍;
2、年份是400的整數倍。
【輸入描述】輸入的第一行包含一個整數y,表示年份,年份在1到2014之間(包含1和2014)。
輸入的第二行包含一個整數m,表示月份,m在1至12之間。
輸入的第三行包含一個正整數d,表示日期,d在1至31之間。
【輸出描述】輸出兩個日期之間相差的天數。
【輸入樣例】
1988
7
3
【輸出樣例】
9449
日期距離參考代碼
#include <iostream>
using namespace std;
int day[13]={0,31,0,31,30,31,30,31,31,30,31,30,31};
bool check(int k) ?//判斷閏年
{if(k%400==0||(k%4==0&&k%100!=0))return true;return false;
}
int sum;//計算總天數
int main()
{int m,n,d;cin>>m>>n>>d;if(check(m)) ?day[2]=29;else ?day[2]=28;for(int i=m+1;i<2014;i++) ?//計算完整的年份天數{if(check(i)) ?sum+=366;else sum+=365;}if(m==2014){for(int i=n+1;i<5;i++) //計算完整的月份的天數sum+=day[i];if(n==5) sum+=17-d;else sum+=day[n]-d+17;}else{sum+=137; //2014.1.1~2014.5.17總天數for(int i=n+1;i<=12;i++) ??//算上完整月份天數sum+=day[i];sum+=day[n]-d; ??}cout<<sum<<endl;return 0;
}
從入門到算法,再到數據結構,查看全部文章請點擊此處?????http://www.bigbigli.com/