codeup之日期差值
description
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。
Input
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
Output
每组数据输出一行,即日期差值
Sample Input Copy
20130101
20130105
Sample Output Copy
5
idea
- 闰年:2月29天,一年366天
平年:2月28天,一年365天
判断平年or闰年:
能被4整除但不能被100整除 或者 能被400整除为闰年,
否则为平年 - 注意日期相同为一天
例如20220107-20220107相差一天(7号共一天
20220107-20220108相差两天(7号和8号共两天
solution1
#include <cstdio>
#include <algorithm>
using namespace std;
bool leap(int i){
if(i % 400 == 0 || (i % 4 == 0 && i % 100 != 0))
return true;
else
return false;
}
int main(){
int t[2], y[2], m[2], d[2], day, month[7] = {1, 3, 5, 7, 8, 10, 12}, temp, flag, flag1;
while(scanf("%d%d", &t[0], &t[1]) != EOF){
flag = 1;
temp = 0;
if(t[0] > t[1])
swap(t[0], t[1]);
for(int i = 0; i < 2; i++){
y[i] = t[i] / 10000;
m[i] = t[i] % 10000 / 100;
d[i] = t[i] % 100;
}
day = (y[1] - y[0])*365;
for(int i = y[0]; i < y[1]; i++)//闰年366天,多一天
if(leap(i))
day++;
if(m[0] > m[1]){
flag = -1;
swap(m[0], m[1]);
swap(y[0], y[1]);
}
for(int i = m[0]; i < m[1]; i++){
flag1 = 0;
for(int j = 0; j < 7; j++){
if(i == month[j]){
temp += 31;
flag1 = 1;
break;
}
}
if(i == 2 && !flag1){
if(leap(y[1]))
temp += 29;
else
temp += 28;
}
else if(!flag1)
temp += 30;
}
day += flag*temp + d[1] - d[0] + 1;
printf("%d\n", day);
}
return 0;
}
solution2
#include <cstdio>
#include <algorithm>
using namespace std;
int leap(int i){
if(i % 400 == 0 || (i % 4 == 0 && i % 100 != 0))
return 0;
else
return 1;
}
int main(){
int t[2], y[2], m[2], d[2], day, month[13][2] = {{0}, {31, 31}, {29, 28}, {31, 31}, {30, 30}, {31, 31}, {30, 30}, {31, 31}, {31, 31}, {30, 30}, {31, 31}, {30, 30}, {31, 31}};
while(scanf("%d%d", &t[0], &t[1]) != EOF){
int temp = 0, flag = 1;
if(t[0] > t[1])
swap(t[0], t[1]);
for(int i = 0; i < 2; i++){
y[i] = t[i] / 10000;
m[i] = t[i] % 10000 / 100;
d[i] = t[i] % 100;
}
day = (y[1] - y[0])*365;
for(int i = y[0]; i < y[1]; i++)//闰年366天,多一天
if(!leap(i))
day++;
if(m[0] > m[1]){
flag = -1;
swap(m[0], m[1]);
swap(y[0], y[1]);//需要相应年份判断平闰
}
while(m[0] < m[1]){
temp += month[m[0]][leap(y[1])];
m[0]++;
}
day += flag*temp + d[1] - d[0] + 1;
printf("%d\n", day);
}
return 0;
}