日期差值C++
日期問題是一種簡單的模擬問題,通程序式模擬時間推移,日期前進,年月更替的方式,可以優雅的得到問題的答案
但這種模擬有一些細節和注意事項需要留意,否則我們將難以獲得正確的答案,下面列出這些注意事項:
- 平年的2月有28天,而閏年則有29天,可以開第二維大小為2的二維陣列進行區分,下面的代碼中以二維大小等于0為平年、等于1為閏年進行示范
- 每個月份的天數并不相同,參照一月大、二月小······的口訣開一個int型別的陣列進行模擬
- 閏年是指:是4的倍數但不是100的倍數 或 是400的倍數 的年份
下面的示范代碼以單點測驗代碼為例,本人博客的其他題解文章也都會采取此種方式,因為會寫單點測驗代碼的人一定可以寫出多點測驗代碼,反之則未必,
另外,在示范代碼的末尾附贈大家幾組測驗樣例方便大家除錯自己的代碼
示范代碼見下
#include<iostream>
using namespace std;
#define SMALL {30,30}//對 {平年小月天數,閏年小月天數} 進行宏替換以加快輸入速度
#define BIG {31,31}//同上
int month[13][2] = { {0,0}, BIG, {28,29}, BIG, SMALL, BIG, SMALL, BIG, BIG, SMALL, BIG, SMALL, BIG };
//month[i][0]表示平年i月的天數,month[i][1]則表示閏年的情況
int time1, year1, month1, day1;//time1、time2用于記錄YYYYMMDD型(例如20020508)整體日期方便后面進行大小比較
int time2, year2, month2, day2;
const int maxMonth = 12;//無論平年閏年,一年只有12個月
bool isLeapYear(int year)//判斷是否是閏年的函式,參照上面的注意事項3不難理解
{
return (year % 4 == 0 and year % 100 != 0) or year % 400 == 0;
}
int main()
{
ios::sync_with_stdio(false);//如果像本人一樣不喜歡C風格的輸入輸出,而又很在意C++的io流低下的效率,那么關閉與stdio的同步是很好的選擇
while (cin >> time1 >> time2)//單點測驗,回圈輸入
{
//為保證time1 < time2,需要判斷大小,若time1大,則交換
if (time1 > time2)
int temp = time1, time1 = time2, time2 = temp;
//從time1\time2中取出year1\year2等值
year1 = time1 / 10000, month1 = (time1 % 10000) / 100, day1 = time1 % 100;
year2 = time2 / 10000, month2 = (time2 % 10000) / 100, day2 = time2 % 100;
int ans = 1;//答案answer,初始化為1是因為題目要求連續日期之間的天數為2天
//第一個日期沒有達到第二個日期時進行回圈
while (year1 != year2 or month1 != month2 or day1 != day2)
{
day1++;//模擬的核心,不斷更新日期1使之不斷逼近日期2,而日期的前進應從day開始
//注意這里我們選擇先將day1++再進行判斷,因此判斷時應將這一天級訓來
if (day1 - 1 == month[month1][isLeapYear(year1)])//判斷day1 - 1是否達到當月最大天數
day1 = 1, month1++;//日期變為下個月的首日
if (month1 - 1 == maxMonth)//同上
year1++, month1 = 1;//日期變為下一年的首日
ans++;//最重要的answer++不能忘
}
//回圈結束表示日期1已經達到了日期2,可以輸出答案了
cout << ans << endl;
}
return 0;
}
測驗樣例見下
樣例輸入1:
18750502
20020508
樣例輸出1:
46393
樣例輸入2:
17760103
20210305
樣例輸出2:
89547
好了,本篇關于日期差值問題的博文就到此結束了,這也是本人所寫的第一篇博客,以后會更新更多學習路上所攻克的難題,讓我們一起加油!
最后,我是耀桑,期待你的關注
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/266696.html
標籤:其他
下一篇:vue專案之axios封裝(2)
