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

news2024/11/24 13:28:45

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

文章目录

  • 1. KY111 日期差值
    • 1.1 题目分析
    • 1.2 代码
  • 2. KY258 日期累加
    • 2.1 题目分析
    • 2.2 代码

1. KY111 日期差值

在这里插入图片描述

1.1 题目分析

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

bool is_Leapyear(int year) {
    if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
        return true;
    } else {
        return false;
    }
}

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

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。

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,不同就交换,这里也是提起写了交换函数:

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–的对应的日期都加起来:

 while (!((y1 == y2) && (m1 == m2))) {
            m1--;
            if (m1 == 0) {
                m1 = 12;
                y1--;
            }
            sum += GetMonthDay(y1, m1);
        }

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

1.2 代码

#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。

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++,注意顺序:

sum -= GetMonthDay(y, m);
            m++;

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

  if (m > 12)
      {
          y++;
          m = 1;
       }

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

2.2 代码

#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")

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1494741.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Apache POI 解析和处理Excel

摘要&#xff1a;由于开发需要批量导入Excel中的数据&#xff0c;使用了Apache POI库&#xff0c;记录下使用过程 1. 背景 Java 中操作 Excel 文件的库常用的有Apache POI 和阿里巴巴的 EasyExcel 。Apache POI 是一个功能比较全面的 Java 库&#xff0c;适合处理复杂的 Offi…

Stable Diffusion V3测评

1.引言 3月5号&#xff0c;Stability AI发布了介绍Stable Diffusion V3的研究论文&#xff0c;链接地址&#xff1a;戳我 这是目前他们发布的最先进、功能最强大的图像生成器&#xff0c;与一年多前发布的令人印象深刻的 Stable Diffusion V2.1 相比有了大幅升级。SD3所带来的…

redis进阶(一)

文章目录 前言一、Redis中的对象的结构体如下&#xff1a;二、压缩链表三、跳跃表 前言 Redis是一种key/value型数据库&#xff0c;其中&#xff0c;每个key和value都是使用对象表示的。 一、Redis中的对象的结构体如下&#xff1a; /** Redis 对象*/ typedef struct redisO…

软考65-上午题-【面向对象技术】-面向对象分析、设计、测试

一、面向对象分析OOA 1-1、面向对象分析的定义 面向对象分析的目的&#xff1a;为了获得对应用问题的理解。理解的目的是确定系统的功能、性能要求。 面向对象分析包含5个活动&#xff1a;&#xff08;背&#xff01;&#xff09; 认定对象&#xff1b;&#xff08;重要一点…

爆肝!Claude3与ChatGPT-4到底谁厉害,看完你就知道了!

前言&#xff1a; 相信大家在pyq都被这张图片刷屏了把~ 昨天&#xff0c;为大家介绍了一下什么是Claude&#xff0c;今天咱终于弄到号了&#xff08;再被ban了3个号之后终于是成功的登上去了&#xff0c;如果各位看官觉得咱文章写的不错&#xff0c;麻烦点个小小的关注~你们的…

android开发基础有哪些,985研究生入职电网6个月

不好意思久等了 这篇文章让小伙伴们久等了。 一年多以来&#xff0c;关于嵌入式开发学习路线、规划、看什么书等问题&#xff0c;被问得没有一百&#xff0c;也有大几十次了。但是无奈自己对这方面了解有限&#xff0c;所以每次都没法交代&#xff0c;搞得实在不好意思。 但…

Linux conntrack和iptables技术解析

Linux虚拟文件系统管理技术 1. netfilter解析1.1 netfilter的基础原理1.2 netfilter的相关hook 2. conntrack解析2.1 conntrack的基础原理2.2 conntrack的表记录解析 3. iptables解析3.1 iptables基础原理3.2 融合conntrack表的iptables规则 4. 疑问和思考4.1 conntrack和iptab…

【vue3之组合式API】

组合式API 一、setup1.写法2.如何访问3.语法糖4.同步返回对象 二、reactive()和ref()1.reactive()2.ref() 三、computed四、watch函数1侦听单个数据2.侦听多个数据3. immediate4. deep5.精确侦听对象的某个属性 五、生命周期函数六、组件通信1.父传子2. 子传父 七、模版引用1. …

【C++精简版回顾】20.模板的使用

1.模板起源 1.模板的定义 1.针对函数属性模板 //针对函数属性 template <class VOID > VOID print1(int a) {cout << a << endl; } 2.针对数据属性模板 //针对数据属性 template <typename INT,typename FLOAT> void print2(INT a,FLOAT b) {cout <…

网工内推 | 华为成都研究所,24届应届生人才储备计划

华为成都研究所 招聘岗位 网络工程师&#xff08;2024应届&#xff09; 岗位要求 24届的学员 本科公办院校 英语4/6级 有HCIP优先 工作地点 成都 私信小编&#xff0c;回复【内推】&#xff0c;获取内推名额申请资格~ 想获取更多『 思科 | 华为 | 红帽 认证真题 』、『 网…

正向代理和反向代理区别

正向代理和反向代理的区别&#xff1a; 特点正向代理反向代理位置位于客户端和目标服务器之间位于目标服务器和客户端之间代理对象代理服务器代表客户端发送请求到目标服务器代理服务器代表目标服务器接收客户端的请求配置客户端需要手动配置代理服务器客户端不需要知道代理服…

Redis(5.0)

1、什么是Redis Redis是一种开源的、基于内存、支持持久化的高性能Key-Value的NoSQL数据库&#xff0c;它同时也提供了多种数据结构来满足不同场景下的数据存储需求。 2、安装Redis&#xff08;Linux&#xff09; 2.1、去官网&#xff08;http://www.redis.cn/&#xff09;下…

7、Redis-事务、持久化、内存淘汰机制和过期key处理

目录 一、事务 二、持久化 三、内存淘汰机制 四、过期key处理 一、事务 Redis的事务本质上就是一个批量执行命令的操作。分为三个步骤&#xff1a; 开始事务&#xff1a;multi命令入队&#xff1a;正常输入命令即可执行事务&#xff08;依次执行命令&#xff09;&#xf…

最近开发中遇到的一些问题

puppeteer下载失败问题 使用的淘宝镜像&#xff0c;但执行命令npm i puppeteer之后&#xff0c;报错&#xff1a; npm ERR! code 1 npm ERR! path E:\项目-临时\test_install_puppeteer\node_modules\puppeteer npm ERR! command failed npm ERR! command C:\WINDOWS\system3…

Android开发教程入门,那些被大厂优化的程序员们

Binder原理 1、概述 Android系统中&#xff0c;涉及到多进程间的通信底层都是依赖于Binder IPC机制。例如当进程A中的Activity要向进程B中的Service通信&#xff0c;这便需要依赖于Binder IPC。不仅于此&#xff0c;整个Android系统架构中&#xff0c;大量采用了Binder机制作…

数据库原理(关系代数)

1.集合运算符基础 要求&#xff1a; 具有相同的目n&#xff08;即两个关系都有n 个属性&#xff09;相应的属性取自同一个域t是元组变量&#xff0c; t R表示t是R的一个元组 1.1并 符号&#xff08;&#xff09; R∪S { t|t R∨t S } 结果特征&#xff1a; 仍为n 目关…

长度为n的数组a初始值全为0,目标是把数组a变为数组b(1<=bi<=n), 可以进行任意次操作:选择长度为k的数组c,(1<=ci<=n且两两不同)

对于1<i<k, 把 a[c[i]] 改为c[i % k 1]。给定n&#xff0c;k和数组b&#xff0c;判断能否得到数组b。 题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #d…

python使用zmail实现邮件发送

一&#xff1a;zmail介绍 1、Zmail的优势 自动填充大多数导致服务端拒信的头信息&#xff08;From To LocalHost之类的)将一个字典映射为email&#xff0c;构造信件就像构造字典一样简单自动寻找邮件服务商端口号地址&#xff0c;自动选择合适的协议&#xff08;经过认证的&am…

docker 安装 portainer

小编给友友们总结了一下 Portainer 的好处以下 Portainer是Docker的图形化管理工具&#xff0c;提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作&#xff08;包括上传下载镜像&#xff0c;创建容器等操作&#xff09;、事件日志显示、容器控制台操作、Swar…

CAPL - 如何实现弹窗提示和弹窗操作

目录 函数介绍 TestWaitForTesterConfirmation Example 使用方法一 使用方法二