C/C++—有关日期类的OJ题

✨✨ 欢迎大家来到小伞的大讲堂✨✨

🎈🎈养成好习惯,先赞后看哦~🎈🎈

所属专栏:C++学习

小伞的主页:xiaosan_blog

1.计算日期到天数的转换(简单)

计算日期到天数转换__牛客网 (nowcoder.com)​​​​​​

这题主要考察对闰年平年的判断,大家肯定能轻松解决的!!!

#include <stdio.h>

int main() {
    int y, m, d;
    scanf("%d %d %d", &y, &m, &d);
     //判断是否为闰年
    int arr[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    if (((y % 4 == 0) && (y % 100 != 0)) || y % 400 == 0) {
        arr[1] = 29;

    }//求和
    int sum = 0;
    for (int i = 0; i < m - 1; i++) {
        sum += arr[i];
    }
    sum += d;
    printf("%d", sum);
    return 0;

}

2.日期差值(简单)

日期差值__牛客网 (nowcoder.com)

本题我采用的是年月分别求和(y1为最大值),计算两个的年份的差值(单独计算),求和他们本年的天数,sum求和;

相信大家会有更方便的方法的!!!

#include <stdio.h>

void swap(int* x, int* y) {
    int tmp = *x;
    *x = *y;
    *y = tmp;
}

int main() {
    int y1, m1, d1, y2, m2, d2;
    int arr[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    scanf("%4d%2d%2d", &y1, &m1, &d1);
    scanf("%4d%2d%2d", &y2, &m2, &d2);
    int sum2 = 0;
    int sum1 = 0;
    //因为后面我认为y1为大值,所以在这里判断将y1设置为大值
    if (y1 < y2) {
        swap(&y1, &y2);
        swap(&m1, &m2);
        swap(&d1, &d2);
    }
    if (y1 == y2) {
        if (m1 < m2) {
            swap(&m1, &m2);
            swap(&d1, &d2);
        }
    }
    if (y1 == y2) {
        if (m1 == m2) {
            if (d1 < d2) {
                swap(&d1, &d2);
            }
        }
    }

    //差的年数
    int x = y1 - y2;
    //记录y2年的天数
    if (((y2 % 4 == 0) && (y2 % 100 != 0)) || y2 % 400 == 0) {
        //判断是否为闰年
        arr[1] = 29;
    }
    for (int i = 0; i < m2 - 1; i++) {
        sum2 += arr[i];
    }
    sum2 += d2;
    //记录y1年的天数
    if (((y1 % 4 == 0) && (y1 % 100 != 0)) || y1 % 400 == 0) {
        //判断是否为闰年
        arr[1] = 29;
    }
    for (int i = 0; i < m1 - 1; i++) {
        sum1 += arr[i];
    }
    sum1 += d1;
    for (int i = 0; i < x; i++) {
        if (((y1 % 4 == 0) && (y1 % 100 != 0)) || y1 % 400 == 0) {
            sum1 += 366;
        } else {
            sum1 += 365;
        }
    }
    printf("%d", sum1 - sum2+1);

    return 0;
}

3.日期累加

日期累加__牛客网 (nowcoder.com)

本题主要处理进位的问题,注意本题的打印格式

#include <iostream>
using namespace std;

static int arr[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

int main() {
    int n;
    scanf("%d", &n);
    while (n--) {
        int y, m, d, add;
        //将年月日分别取值,以便后续分别处理
        scanf("%4d%2d%2d", &y, &m, &d);
        scanf("%d", &add);
        d += add;//将日相加
        if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) {
            arr[2] = 29;
        }
        //判断是否超过当月的天数
        while (d > arr[m]) {
            if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) {
                arr[2] = 29;
            } else {
                arr[2] = 28;
            }
            d -= arr[m];
            m++;
            while (m > 12) {
                m -= 12;
                y++;
            }
        }
        //因为对打印的值有特殊要求,这里需要特殊处理
        if (m > 9)
            if (d > 9) {
                printf("%d-%d-%d\n", y, m, d);
            } 
            else {
                printf("%d-%d-0%d\n", y, m, d);
            } 
        else{ 
           if (d > 9) {
            printf("%d-0%d-%d\n", y, m, d);
           } 
           else {
            printf("%d-0%d-0%d\n", y, m, d);
           }
        }
    }
}
相关推荐
一只小小汤圆10 分钟前
opencascade源码学习之BRepOffsetAPI包 -BRepOffsetAPI_DraftAngle
c++·学习·opencascade
醉陌离12 分钟前
渗透测试笔记——shodan(4)
笔记
LateBloomer77727 分钟前
FreeRTOS——信号量
笔记·stm32·学习·freertos
legend_jz31 分钟前
【Linux】线程控制
linux·服务器·开发语言·c++·笔记·学习·学习方法
Komorebi.py32 分钟前
【Linux】-学习笔记04
linux·笔记·学习
嘿BRE40 分钟前
【C++】几个基本容器的模拟实现(string,vector,list,stack,queue,priority_queue)
c++
莫叫石榴姐1 小时前
数据科学与SQL:组距分组分析 | 区间分布问题
大数据·人工智能·sql·深度学习·算法·机器学习·数据挖掘
ö Constancy2 小时前
c++ 笔记
开发语言·c++
fengbizhe2 小时前
笔试-笔记2
c++·笔记
余为民同志2 小时前
mini-lsm通关笔记Week2Day4
笔记