前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【OJ】日期差值与日期累加

【OJ】日期差值与日期累加

作者头像
zxctscl
发布2024-03-08 08:54:09
1130
发布2024-03-08 08:54:09
举报
文章被收录于专栏:zxctscl个人专栏zxctscl个人专栏

个人主页zxctscl 如有转载请先通知

1. KY111 日期差值

1.1 题目分析

日期之间比较可能会出现给的两个年月日都不相同,这个就不好作差,每个月给的天数不同,还有可以是闰年,得先判断一下是不是闰年,这里就写一个判断闰年的函数:

代码语言:javascript
复制
bool is_Leapyear(int year) {
    if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
        return true;
    } else {
        return false;
    }
}

因为每个月的日期不一样,可以写一个获取每个月日期的函数,只是在2月份的时候,闰年就返回29,平年就是28。

代码语言:javascript
复制
int GetMonthDay(int year, int month) {
    int monthDay[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    if (month == 2 && (is_is_Leapyear(year))) {
        return 29;
    }

考虑到输入的时候日期大小的顺序可能是不相同的,那么就统一设置一下,1的输入的日期都比2的大,这里就写一个判断日期大小的函数: 先比较年,年如果相同就比较月,月如果相同就比较日,如果1的都大于2的就是正确,否则就返回false。

代码语言:javascript
复制
bool Max(int y1, int m1, int d1, int y2, int m2, int d2) {
    if (y1 > y2) {
        return true;
    } else if (y1 == y2) {
        if (m1 > m2)
            return true;
        else if (m1 == m2)//月相等比较日期即可
            if (d1 > d2) {
                return true;
            } else {
                return false;
            } else //年相等,月小了
            return false;
    } else {
        return false;
    }
    return false;
}

在写main时候,得注意输入,题目要求的是年月日相连直接输入,在写输入的时候得注意格式scanf("%04d%02d%02d\n%04d%02d%02d", &y1, &m1, &d1, &y2, &m2, &d2) != EOF。 再将日期统一为1的都大于2,不同就交换,这里也是提起写了交换函数:

代码语言:javascript
复制
if (!Max(y1, m1, d1, y2, m2, d2)) {
            Swap(y1, y2);
            Swap(m1, m2);
            Swap(d1, d2);
        }

当年月都相同时候,日期直接相减就能得到相差的日期,顾在写判断的时候就写为 while (!((y1 == y2) && (m1 == m2))),把m1月份先减来同m2一样,如果等于0了,m1月份就设置为12,同时年份得减1,把每一次m1–的对应的日期都加起来:

代码语言:javascript
复制
 while (!((y1 == y2) && (m1 == m2))) {
            m1--;
            if (m1 == 0) {
                m1 = 12;
                y1--;
            }
            sum += GetMonthDay(y1, m1);
        }

循环结束时候1的年月与2的年月是一样的,这时候直接让d1 - d2,就是在相同年月下的差值,再加上之前的sum就是相差的日期。但是得注意题目写了日期相差得多一天,所以这里在最后的加上1。

1.2 代码

代码语言:javascript
复制
#include <iostream>
using namespace std;
bool is_Leapyear(int year) {
    if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
        return true;
    } else {
        return false;
    }
}
int GetMonthDay(int year, int month) {
    int monthDay[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    if (month == 2 && (is_Leapyear(year))) {
        return 29;
    }

    return monthDay[month];
}

void Swap(int& a, int& b) {
    int tmp = a;
    a = b;
    b = tmp;
}
bool Max(int y1, int m1, int d1, int y2, int m2, int d2) {
    if (y1 > y2) {
        return true;
    } else if (y1 == y2) {
        if (m1 > m2)
            return true;
        else if (m1 == m2)//月份相等比较日期大小
            if (d1 > d2) {
                return true;
            } else {
                return false;
            } else //月小
            return false;
    } else {
        return false;
    }
    return false;
}

int main() {
    int y1, m1, d1;
    int y2, m2, d2;
    int sum = 0;
    while (scanf("%04d%02d%02d\n%04d%02d%02d", &y1, &m1, &d1, &y2, &m2, &d2) != EOF) {
        // 注意 while 处理多个 case
        if (!Max(y1, m1, d1, y2, m2, d2)) {
            Swap(y1, y2);
            Swap(m1, m2);
            Swap(d1, d2);
        }
        while (!((y1 == y2) && (m1 == m2))) {
            m1--;
            if (m1 == 0) {
                m1 = 12;
                y1--;
            }
            sum += GetMonthDay(y1, m1);
        }
        int d = d1 - d2;
        sum += d;
        sum += 1;
        cout << sum << endl;

    }
}
// 64 位输出请用 printf("%lld")

2. KY258 日期累加

2.1 题目分析

与日期有关的计算就必须得区别闰年与平年的2月份,同样先写一个获取每个月对应的日期: 如果是闰年那么就返回29。

代码语言:javascript
复制
int GetMonthDay(int year, int month) {
    int monthDay[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))) {
        return 29;
    }
    return monthDay[month];
}

这里既然已经有给定与已经给的日期相差的天数,那么不如直接将个的d也加上sum = sum + d;,这样的话就好凑整月。如果这个月对应的日期满了,那么就直接让sum减去对应月份的天数,再m++,注意顺序:

代码语言:javascript
复制
sum -= GetMonthDay(y, m);
            m++;

但是这里得注意循环条件sum必须大于所对应的月份才能进入循环:while (sum > GetMonthDay(y, m))。 在循环中得考虑,当m>12时候,这是,年份就得加1,而月份就调整为0:

代码语言:javascript
复制
  if (m > 12)
      {
          y++;
          m = 1;
       }

最后出了循环,再把d = sum;就可以了。 注意题目给的要求,输出的日期格式:printf("%04d-%02d-%02d\n", y, m, d)

2.2 代码

代码语言:javascript
复制
#include <iostream>
using namespace std;
int GetMonthDay(int year, int month) {
    int monthDay[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))) {
        return 29;
    }
    return monthDay[month];
}

int main() {
    int n, y, m, d, sum;
    scanf("%d\n", &n);
    while (n--) { // 注意 while 处理多个 case
        scanf(" %d %d %d %d", &y, &m, &d, &sum);
        sum = sum + d;
        while (sum > GetMonthDay(y, m))
        {
            sum -= GetMonthDay(y, m);
            m++;
            if (m > 12)
            {
                y++;
                m = 1;
            }
        }
        d = sum;

        printf("%04d-%02d-%02d\n", y, m, d);
    }
}
// 64 位输出请用 printf("%lld")

有问题请指出,大家一起进步!!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. KY111 日期差值
    • 1.1 题目分析
      • 1.2 代码
      • 2. KY258 日期累加
        • 2.1 题目分析
          • 2.2 代码
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档