PKU2018计算机机试 & 日期天数计算

题目描述

百练

A:计算两个日期之间的天数

  • 总时间限制:

    1000ms

  • 内存限制:

    65536kB

  • 描述

    给定两个日期,计算相差的天数。比如2010-1-1和2010-1-3相差2天。

  • 输入

    共两行: 第一行包含三个整数startYear,startMonth,startDay,分别是起始年、月、日。 第二行包含三个整数endYear,endMonth,endDay,分别是结束年、月、日。 相邻两个整数之间用单个空格隔开。 年份范围在1~3000。保证日期正确且结束日期不早于起始日期。

  • 输出

    输出一个整数,即是两个日期相差的天数。

  • 样例输入

    1
    2
    2018 1 1
    2019 1 1
  • 样例输出

    366

  • 提示

    闰年被定义为能被4整除的年份,但是能被100整除而不能被400整除的年是例外,它们不是闰年。闰年的2月份有29天。

codeup相同题目

日期差值

题目描述

有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。

输入

有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD

输出

每组数据输出一行,即日期差值

样例输入

1
2
20130101
20130105

样例输出

1
5

题目分析

思路:在开始的时候,我考虑了各种情况,比如前一年为闰年,后一年为平年,比如月份区间包含不包含2月。总之脑子都快炸了也没想出所有的情况,以至于一直AC不了,心态崩溃。

实际上,这个题一个简单的思路:天数相加,知道加到目的天数为止。

//notice,这里用字符串处理截取超级麻烦,不如用int求余算的比较快。

两个坑:

  • codeup那个需要比较日期大小
  • codeup那个还需要注意是多组数据。(如何输入多组数据)

如何方便快捷地实现,如何利用数组。

AC代码(codeup版)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

#include <stdio.h>
#include <iostream>
#include <cstring>
#include <stdlib.h>

using namespace std;
bool issun(int year) {
if ((year % 100 != 0 &&year % 4 == 0)||year%400==0) {//判断 闰年 的方法!!
return true;
}
else{
return false;
}
}

int main()
{
int a1, a2;
int year1, year2, mon1, mon2, day1, day2;
while(scanf("%d%d",&a1,&a2)!=EOF){
//没有强调,需要保证前者早于后者。

if (a1 > a2) {
int tmp = a1;
a1 = a2;
a2 = tmp;
}
day1 = a1 % 100;
a1 = a1 / 100;
mon1 = a1 % 100;
a1 = a1 / 100;
year1 = a1 % 10000;
day2 = a2 % 100;
a2 = a2 / 100;
mon2 = a2 % 100;
a2 = a2 / 100;
year2 = a2 % 10000;
int days = 1;
int mon[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
int mons[13] = { 0,31,29,31,30,31,30,31,31,30,31,30,31 };
while (!(year1 == year2&&mon1 == mon2&&day1 == day2)) {
day1++;

if (issun(year1)) {
if (day1 == mons[mon1] + 1) {
day1 = 1;
mon1++;
}
}
else {
if (day1 == mon[mon1] + 1) {
day1 = 1;
mon1++;
}

}
if (mon1 == 13) {
mon1 = 1;
year1++;
}
days++;
}
printf("%d\n", days);

}

return 0;
}