携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第13天,点击查看活动详情
7-3 日期类
题目描述:
编写一个日期类,要求按 xxxx-xx-xx 的格式输出日期,实现加一天的操作。
输入格式:
第一行包含整数 T,表示共有 T 组测试数据。
每组数据占一行,包含 3 个用空格隔开的整数,分别表示年月日。
输出格式:
每组数据输出一行,一个结果,按 xxxx-xx-xx 的格式输出,表示输入日期的后一天的日期。
数据范围:
输入日期保证合法且不会出现闰年。
年份范围 [1000,3000]
输入样例:
在这里给出一组输入。例如:
2
1999 10 20
2001 1 31
输出样例:
在这里给出相应的输出。例如:
1999-10-21
2001-02-01
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 M
思路分析:
- monther数组记录平年的每个月份的天数
- 先判断日再判断月最后判断年
代码如下:
#include<iostream>
using namespace std;
int monther[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
void addone(int x, int y, int z) {
int temp = z + 1;
//先对日处理
if (temp > monther[y]) {
z = 1;
y++;
//再对月进行处理
if (y > 12) {
y = 1;
x++;
}
}
else
z++;
printf("%d-%02d-%02d\n", x, y, z);
}
int main()
{
int n;
cin >> n;
int y, m, d;
for (int i = 0; i < n; i++) {
cin >> y >> m >> d;
addone(y, m, d);
}
}
7-4 日期之差
题目描述:
给定两个日期,请你计算这两个日期之间有少天(定义连续的日期之差为2天)
输入格式:
共两行,每一行输入一个日期,日期格式为yyyy-MM-dd
输出格式:
一个正整数,为两个日期之间的差
输入样例:
2021-07-02
2021-07-15
输出样例:
14
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 M
思路分析:
- monther数组,记录平年的天数,闰年另外考虑即可
- 如果年份相同就非常好办这里就不说了
- 如果年份不同,先判断日期的前后
- 将前的日期到下一年的天数算出来
- 将后的日期到前一年的天数算出来
- 累加
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int monther[13] = { 365,31,28,31,30,31,30,31,31,30,31,30,31 };
//判断闰年
bool isLeapYear(int year) {
return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0);
}
//计算天数(这一年)
int daynum(int x, int y, int z) {
int num = 0;
for (int i = 1; i < y; i++) {
num += monther[i];
}
num += z;
if (isLeapYear(x) && y > 2)
num++;
return num;
}
int main()
{
int a, b, c;
int x, y, z;
char temp;
cin >> a >> temp >> b >> temp >> c;
cin >> x >> temp >> y >> temp >> z;
//判断是否要交换
bool flag = true;
if (a > x)
flag = false;
else if (a == z) {
if (b > y)
flag = false;
else if (b == y) {
if (c > z)
flag = false;
}
}
//如果第二个日期小
if (!flag) {
swap(a, x);
swap(b, y);
swap(c, z);
}
int cnt = 0;
if (a != x) {
if(isLeapYear(a))
cnt += 366 - daynum(x, y, z) + daynum(a, b, c) + 1;
else
cnt += 365 - daynum(x, y, z) + daynum(a, b, c) + 1;
for (int i = a + 1; i < x; i++) {
cnt += monther[0];
if (isLeapYear(i))
cnt++;
}
}
else
cnt = daynum(x, y, z) - daynum(a, b, c) + 1;
cout << cnt;
}