題目描述:
1116: 日期差值
時間限制: 1 Sec
內存限制: 32 MB
提交: 2
解決: 2
|
題目描述
有兩個日期,求兩個日期之間的天數,如果兩個日期是連續的我們規定他們之間的天數爲兩天。
輸入
有多組數據,每組數據有兩行,分別表示兩個日期,形式爲YYYYMMDD
輸出
每組數據輸出一行,即日期差值
樣例輸入
20130101
樣例輸出
5 |
(1)思路:對於時期問題設置一個公共起點本題爲00000101(0000年01月01日),用全局變量來存儲每一天到距離起始天的天數。
C++代碼實現:
#include <stdio.h>
#define ISLEAPYEAR(x) x % 100 != 0 && x % 4 == 0 || x % 400 == 0 ? 1 : 0 //用宏判斷是否爲運年
using namespace std;
int dayOfMonth[13][2] = {{0,0}, {31, 31}, {28, 29}, {31,31}, {30, 30}, {31, 31},
{30, 30}, {31, 31}, {31, 31}, {30, 30}, {31, 31}, {30, 30}, {31, 31}};
struct Date{ //日期
int Day;
int Month;
int Year;
void nextDay() {
Day++;
if (Day > dayOfMonth[Month][ISLEAPYEAR(Year)]) { //超過該月的最大天數月數+1
Day = 1;
Month++;
if (Month > 12) { //超過12個月年數+1
Month = 1;
Year++;
}
}
}
};
int buf[5001][13][32]; //保存預處理天數
int Abs(int x) { //去絕對值
return x > 0 ? x : -x;
}
int main() {
Date date;
int count_day = 0; //用於統計天數
date.Day = 1;
date.Month = 1;
date.Year = 0; //Day Month Year 初始化
while (date.Year != 5001) {
buf[date.Year][date.Month][date.Day] = count_day;
date.nextDay();
count_day++;
}
int y1, m1, d1; //用於接收第一個數據
int y2, m2, d2; //用於接收第二個數據
while (scanf("%4d%2d%2d", &y1, &m1, &d1) != EOF) {
scanf("%4d%2d%2d", &y2, &m2, &d2);
printf("%d\n", Abs(buf[y2][m2][d2] - buf[y1][m1][d1]) + 1);
}
return 0;
}
(2)另一種思路:計算出該日期到該年初有多少天,然後加上該年以前的年份每年多少天
C++代碼實現:
#include <stdio.h>
#include <stdlib.h>
int dayOfMonth[13][2] = {{0, 0},{31, 31},{28, 29},{31, 31},{30, 30},{31, 31},
{30, 30},{31, 31},{31, 31},{30, 30},{31, 31},{30, 30},{31, 31}};// 運年特殊處理
bool isLeapYear(int y) { //判斷是否運年
if(y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
return true;
else
return false;
}
int days(int y, int m, int d) { //當前日期到本月初一共多少天
int day = 0, j = 0;
if(isLeapYear(y)) j = 1;
for(int i = 1; i < m; i++) {
day += dayOfMonth[i][j];
}
return day + d;
}
int main() {
int y1, y2, m1, m2, d1, d2, count1, count2;
count1 = count2 = 0;
while(scanf("%4d%2d%2d", &y1, &m1, &d1) != EOF) {
scanf("%4d%2d%2d", &y2, &m2, &d2);
for(int i = 0; i < y1; i++) {
if(isLeapYear(y1)) {
count1 += 366;
} else
count1 += 365;
}
count1 += days(y1, m1, d1);
for(int i = 0; i < y2; i++) {
if(isLeapYear(y2)) {
count2 += 366;
} else count2 += 365;
}
count2 += days(y2, m2, d2);
printf("%d\n", abs(count1 - count2) + 1);
}
return 0;
}