题目描述:
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;
}