当前位置: 首页 > news >正文

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

个人主页 : 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 处理多个 caseif (!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 处理多个 casescanf(" %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")

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

相关文章:

  • Java 设计模式
  • OSPF NSSA实验简述
  • Spring AOP在什么场景下会失效?
  • CDH6.3.1离线安装
  • 组合_回溯法_java
  • 【数据集】MSWEP(多源加权集合降水)再分析数据
  • 大模型交互-超拟人合成
  • 【算法可视化】模拟算法专题
  • Python接口自动化测试框架运行原理及流程
  • 【leetcode】随机链表的复制
  • Nginx使用—基础应用
  • 图像处理与视觉感知---期末复习重点(1)
  • 如何在Spring Boot框架中打印响应的日志?
  • 【Mining Data】收集数据(使用 Python 挖掘 Twitter 数据)
  • js如何渲染页面
  • golang 发送GET和POST示例
  • Javascript Math对象和Date对象常用方法详解
  • k8s 面向应用开发者的基础命令
  • learning koa2.x
  • LeetCode18.四数之和 JavaScript
  • PHP那些事儿
  • session共享问题解决方案
  • Spring Cloud中负载均衡器概览
  • Vue 动态创建 component
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 将 Measurements 和 Units 应用到物理学
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 使用docker-compose进行多节点部署
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 我看到的前端
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 交换综合实验一
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (1)(1.11) SiK Radio v2(一)
  • (2020)Java后端开发----(面试题和笔试题)
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (南京观海微电子)——I3C协议介绍
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (十六)串口UART
  • (五)Python 垃圾回收机制
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)人的集合论——移山之道
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (转)视频码率,帧率和分辨率的联系与区别
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .net连接MySQL的方法
  • @Autowired自动装配
  • @ConditionalOnProperty注解使用说明
  • @Repository 注解
  • [@Controller]4 详解@ModelAttribute