题解 | #日期差值#

日期差值

https://www.nowcoder.com/practice/ccb7383c76fc48d2bbc27a2a6319631c

#include <algorithm>
#include <iostream>
using namespace std;

void swap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
}

int main() {
    int a, b;
    int year, month, day;
    int year2, month2, day2;
    int arr1[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int arr2[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    while (cin >> a >> b) { // 注意 while 处理多个 case
        if (b < a) {
            swap(a, b);
        }

        day = a % 100;
        month = (a / 100) % 100;
        year = (a / 10000);
        day2 = b % 100;
        month2 = (b / 100) % 100;
        year2 = (b / 10000);
        int sum = 0;

        int a = year;
        if (year2 - year) {
            int a = ++year;
            for (int i = a; i < year2; i++) {
                if ((a % 4 == 0 && a % 100 != 0) || (a % 400 == 0)) {
                    sum += 366;
                } else {
                    sum += 365;
                }
            }
            a = year;
            if ((a % 4 == 0 && a % 100 != 0) || (a % 400 == 0)) {
                for (int i = month; i < 12; i++) {

                    sum += arr2[i];
                }
                sum += (arr2[month-1] - day + 1);
            } else {
                for (int i = month; i < 12; i++) {

                    sum += arr1[i];
                }
                sum += (arr1[month-1] - day + 1);
            }
            a = year2;
            if ((a % 4 == 0 && a % 100 != 0) || (a % 400 == 0)) {
                for (int i = 0; i < month2 - 1; i++) {

                    sum += arr2[i];
                }
                sum += day2;
            } else {
                for (int i = 0; i < month2 - 1; i++) {

                    sum += arr1[i];
                }
                sum += day2;
            }
        } else {
            if ((a % 4 == 0 && a % 100 != 0) || (a % 400 == 0)) {
                for (int i = month ; i < month2 - 1; i++) {

                    sum += arr2[i];
                }
                 if (month2 != month) {
                    sum +=arr2[month]-day+1;
                    sum +=day2;
                 } else {
                     sum = day2 - day  + 1;
                  }
            } else {
                for (int i = month ; i < month2 - 1; i++) {

                    sum += arr1[i];
                }
            }
        }
        cout << sum << endl;
    }
}
// 64 位输出请用 printf("%lld")

思路解析:

先处理数据,比较大小后分配大的时间和小的时间,然后数据分为年月日三个,

首先想到将日期差分为三段各自计算加起来,第一段是较小年份的后半段,第二段是中间相隔年份,第三段是较大年份的前半段,

  1. 计算中间年份比较简单,闰年与非闰年差1天;
  2. 计算较小年份的后半段:将当年的最后一天减去当天日期,分两步,计算此日期当月之后的月份,然后计算当月剩余日期,记得加1
  3. 计算较大年份的前半段:将此日期减去当年的第一天,分两步,计算此日期当月之前的月份,然后计算当月所占日期。

如果两日期为同一年

计算两日期之差,也是分三段,第一段计算两月之间的月份时间,第二段小月份后半段所剩的时间,第三段大月份所占的日期,若此时同月:则sum等于大日期的day减去小日期的day再加1,

全部评论

相关推荐

我已成为0offer的糕手:别惯着,胆子都是练出来的,这里认怂了,那以后被裁应届被拖工资还敢抗争?
点赞 评论 收藏
分享
10-10 17:54
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务