时间算——7-3 日期类||7-4 日期之差

·  阅读 10
时间算——7-3 日期类||7-4 日期之差

携手创作,共同成长!这是我参与「掘金日新计划 · 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;
}
复制代码
分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改