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

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

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

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

相关文章

LeetCode每日一题 二叉树的最大深度(二叉树)

题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;root [1,nul…

VUE:key属性的作用

在 Vue.js 中&#xff0c;key属性的主要作用是帮助 Vue 在进行 DOM 更新时&#xff0c;能够更准确地识别哪些节点可以复用。 当key值发生变化时&#xff0c;Vue 会执行以下步骤&#xff1a; 1.查找旧节点&#xff1a;Vue 会查找虚拟 DOM 中具有旧key值的节点。 2.匹配新节点…

Kubernetes编排系统:实现云原生应用的自动化部署与管理

随着云计算和容器技术的日益普及,如何高效、自动化地部署和管理应用成为了企业面临的重要挑战。Kubernetes,作为一个开源的容器编排系统,凭借其强大的功能、灵活性和可扩展性,逐渐成为了业界的宠儿。本文将首先简要介绍Kubernetes编排系统的基本概念,然后详细阐述其核心组…

前端知识点、技巧、webpack、性能优化(持续更新~)

1、 请求太多 页面加载慢 &#xff08;webpack性能优化&#xff09; 可以把 图片转换成 base64 放在src里面 减少服务器请求 但是图片会稍微大一点点 以上的方法不需要一个一个自己转化 可以在webpack 进行 性能优化 &#xff08;官网有详细描述&#xff09;

【详识C语言】自定义类型之一:结构体

本文重点 结构体 结构体类型的声明 结构的自引用 结构体变量的定义和初始化 结构体内存对齐 结构体传参 结构体实现位段&#xff08;位段的填充&可移植性&#xff09; 结构体 结构体的声明 结构的基础知识 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个…

nohup 命令

1. nohup 是 no hang up 的缩写&#xff0c;就是不挂断的意思 如果你正在运行一个进程&#xff0c;而且你觉得在退出帐户时该进程还不会结束&#xff0c;那么可以使用nohup命令。 该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。 2. nohup和&的区别 nohup …

在 SpringBoot3 中使用 Mybatis-Plus 报错

在 SpringBoot3 中使用 Mybatis-Plus 报错 Property ‘sqlSessionFactory’ or ‘sqlSessionTemplate’ are required Caused by: java.lang.IllegalArgumentException: Property sqlSessionFactory or sqlSessionTemplate are requiredat org.springframework.util.Assert.no…

Vue中有哪些优化性能的方法?

Vue是一款流行的JavaScript框架&#xff0c;用于构建交互性强的Web应用程序。在前端开发中&#xff0c;性能优化是一个至关重要的方面&#xff0c;尤其是当应用程序规模变大时。Vue提供了许多优化性能的方法&#xff0c;可以帮助开发人员提升应用程序的性能&#xff0c;从而提升…

管理心理--程序员如何选择职业赛道

不小心看到了这个活动话题&#xff0c;本人前后带过三四百程序员&#xff0c;并成功为不少程序员指明了方向&#xff0c;不少程序员到现在还经常约我吃饭表示感谢。对这个话题应该是有比较深的感触。 一、程序员方向本身的赛道。 一开始呆的都是大厂&#xff0c;程序员一般都…

成员静态函数和回调函数的灵活应用

回调函数与类静态函数 使用typedey定义函数指针使用 std::function<void(void*)> 包装 定义函数回调函数有两种方法 使用typedey定义函数指针 #typedef int (*func)(void*);使用 std::function<void(void*)> 包装

用spark读取及存储数据

读取数据 data spark.sql("""select * from temp.tables""") data.show(3)# 转成pandas方式 # df data.toPandas() # df.head(3)存储数据 table "temp.new_tables" data.write.format("hive").mode("overwrite&qu…

Leetcode刷题(三十七)

全排列II&#xff08;Medium&#xff09; 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。示例 1&#xff1a;输入&#xff1a;nums [1,1,2] 输出&#xff1a; [[1,1,2],[1,2,1],[2,1,1]] 示例 2&#xff1a;输入&#xff1a;nums [1,2…

鸿蒙NEXT开发实战:【网络管理-数据请求】

概述 本示例仿postman输入API接口地址&#xff0c;获取相应数据&#xff0c;介绍数据请求接口的用法。 样例展示 基础信息 Http 介绍 本示例通过[ohos.net.http]等接口&#xff0c;实现了根据URL地址和相关配置项发起http请求的功能。 效果预览 首页结果页 使用说明 1.…

【语言学习】std::transform函数

阅读llvm的这个提交时&#xff0c;发现了其中使用了一个函数std::transform&#xff08;原文对其进行了一层封装&#xff09; 如果不理解std::transform的三个参数的关系&#xff0c;就会对第三个参数的lambda表达式理解不了。其实&#xff0c;第三个参数的作用是提供给了一种…

FP16(半精度浮点数)、FP32(单精度浮点数)和INT8

在深度学习和计算机视觉领域中&#xff0c;FP16&#xff08;半精度浮点数&#xff09;、FP32&#xff08;单精度浮点数&#xff09;和INT8&#xff08;8 位整数&#xff09;是常见的数据类型或精度表示方式。它们在不同的场景下有各自的优势和用途。 FP16&#xff08;半精度浮…

重学SpringBoot3-yaml文件配置

重学SpringBoot3-yaml文件配置 引言YAML 基本语法YAML 数据类型YAML 对象YAML 数组复合结构标量引用 YAML 文件结构Spring Boot 中的 YAML 配置注意事项总结参考 引言 YAML&#xff08;YAML Ain’t Markup Language&#xff09;是一种常用于配置文件的数据序列化格式&#xff…

Docker 部署Harbor 443端口冲突

如果Harbor的443端口和主机服务器的443端口存在冲突,那么需要修改Harbor的443 修改docker-compose中443端口,那么需要docker-compose.yml和harbor.yml保持一致配置 当修改harbor.yml重启之后不生效的,则需要进入harbor安装路径 执行 ./install.sh 命令 harbor.yml docker-…

5G智能制造食品工厂数字孪生可视化平台,推进食品行业数字化转型

5G智能制造食品工厂数字孪生可视化平台&#xff0c;推进食品行业数字化转型。随着科技的飞速发展&#xff0c;食品工业正迎来一场前所未有的数字化转型。在这场转型中&#xff0c;5G智能制造工厂数字孪生可视化平台发挥着至关重要的作用。它不仅提高了生产效率&#xff0c;降低…

论文笔记:Compact Multi-Party Confidential Transactions

https://link.springer.com/chapter/10.1007/978-3-030-65411-5_21 A compact, private, Multi-Party Confidential Transactions (MCT) 紧凑型多方机密交易&#xff08;Compact MCT&#xff09;&#xff1a;MCT的长度与常规的单一所有者交易一样短&#xff1b;换句话说&…

前端面试知识点合集(持续性更新)

原型和原型链 任何函数都可以作为构造函数。当该函数通过 new 关键字调用的时候&#xff0c;就称之为构造函数。 var Parent function(){}//定义一个函数&#xff0c;那它只是一个普通的函数&#xff0c;不能称它为构造函数var instance new Parent(); //这时这个Parent就不…