C++实现两个日期间差多少天的解决方法

下面是“C++实现两个日期间差多少天的解决方法”的完整攻略。

一、问题描述

假设有两个日期,分别为 start_dateend_date,请实现一个函数,计算两个日期间相隔的天数。

二、解决思路

我们可以将日期转化为距离某个固定日期的天数,然后求两个日期距离固定日期的天数之差。这里我们取 1900年1月1日 作为固定日期。

将日期转化为天数的方法:假设输入日期为 y1-m1-d1,那么这个日期距离 1900年1月1日 的天数可表示为 day1 = (y1-1900)*365 + leap_years(y1) + month_days[m1-1] + d1 - 1。其中,leap_years(y) 用于计算从1900年到y年之间有多少个闰年, month_days 则表示每个月的天数,需要根据闰年和平年进行调整。

三、示例代码

#include <iostream>
using namespace std;

int month_days[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; // 每个月的天数
int leap_month_days[12] = {31,29,31,30,31,30,31,31,30,31,30,31}; // 闰年每个月的天数

// 计算从1900年到y之间的闰年数
int leap_years(int y) {
    return (y - 1900) / 4 - (y - 1900) / 100 + (y - 1600) / 400;
}

// 判断是否是闰年
bool is_leap_year(int y) {
    return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}

// 计算日期距离1900年1月1日的天数
int days(int y, int m, int d) {
    int total_days = (y - 1900) * 365; // 距离1900年1月1日的总天数
    total_days += leap_years(y); // 加上闰年数
    for (int i = 0; i < m - 1; i++) {
        if (is_leap_year(y)) {
            total_days += leap_month_days[i]; // 闰年月份天数累加
        } else {
            total_days += month_days[i]; // 平年月份天数累加
        }
    }
    total_days += d - 1; // 加上当前月份天数
    return total_days;
}

// 计算两个日期的差值
int date_diff(int y1, int m1, int d1, int y2, int m2, int d2) {
    int days1 = days(y1, m1, d1);
    int days2 = days(y2, m2, d2);
    return days2 - days1;
}

int main() {
    int start_year, start_month, start_day, end_year, end_month, end_day;
    cout << "请输入开始日期(年 月 日,以空格分隔):" << endl;
    cin >> start_year >> start_month >> start_day;
    cout << "请输入结束日期(年 月 日,以空格分隔):" << endl;
    cin >> end_year >> end_month >> end_day;
    int diff = date_diff(start_year, start_month, start_day, end_year, end_month, end_day);
    cout << "相差天数为:" << diff << " 天" << endl;
    return 0;
}

示例输入1:

请输入开始日期(年 月 日,以空格分隔):
2021 7 1
请输入结束日期(年 月 日,以空格分隔):
2021 7 10

示例输出1:

相差天数为:9 天

示例输入2:

请输入开始日期(年 月 日,以空格分隔):
2021 12 31
请输入结束日期(年 月 日,以空格分隔):
2022 1 1

示例输出2:

相差天数为:1 天

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现两个日期间差多少天的解决方法 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C++11 shared_ptr 与 make_shared源码剖析详解

    C++11中的shared_ptr和make_shared是两个非常实用的特性,能够帮助我们更好地管理内存。本文将深入介绍shared_ptr和make_shared的实现原理,帮助读者更好地掌握这两个特性。 1. shared_ptr简介 shared_ptr是C++11提供的一种智能指针,用于管理动态内存。它可以自动对内存进行引用计数,并在引用计数为0时…

    C 2023年5月23日
    00
  • 详解C++编程中的vector类容器用法

    详解C++编程中的vector类容器用法 简介 在 C++ 中,vector 是一个非常实用的容器类,它可以动态调整大小并提供了一系列方便的操作函数。在本文中,我们将详细介绍 vector 类的使用方法,以便能够更好地应用 vector 容器类进行 C++ 编程。 如何使用 vector 首先需要在头文件中包含 vector: #include<vec…

    C 2023年5月22日
    00
  • 孤岛惊魂4进不去 应用程序无法正常启动(0xc000007b)解决方法推荐

    下面是针对“孤岛惊魂4进不去 应用程序无法正常启动(0xc000007b)解决方法推荐”的攻略: 问题描述 当你尝试打开孤岛惊魂4游戏时,系统会报错:应用程序无法正常启动(0xc000007b),导致无法进入游戏。 这个错误通常是由缺少或损坏的动态链接库文件(DLL)引起的。这些库文件是运行游戏时所需的关键组件之一。 解决方法 方法一:安装游戏所需的适当版本…

    C 2023年5月23日
    00
  • Java异常链表throw结构assert详细解读

    请看下面的详细讲解: Java异常链 Java中的异常链是指,当一个异常被抛出时,可能会引发另一个异常。这个被引发的异常可以包含原始异常的信息。这种机制称为异常链。 在Java中,异常链可以通过调用getCause()方法来获得。该方法返回一个Throwable对象,该对象是造成当前异常的原因。如果没有原因,则返回null。 public class Exc…

    C 2023年5月23日
    00
  • 使用c3p0连接数据库实现增删改查

    下面我将详细讲解使用c3p0连接数据库实现增删改查的完整攻略。 使用c3p0连接数据库 c3p0是一个开源的JDBC连接池库。它被大量应用于Java Web开发中,可以有效降低数据库的开销,优化系统的性能。下面介绍如何使用c3p0连接数据库。 步骤一:引入c3p0库 在Java工程的pom.xml文件中添加以下依赖: <dependency> &…

    C 2023年5月22日
    00
  • 详解C++中的this指针与常对象

    详解C++中的this指针与常对象 在C++类中,this指针是一个非常重要的概念。在本文中,我们将详细讲解this指针与常对象的概念、语法以及使用方法。 一、 this指针的概念 this指针是一个隐含的指针,它指向当前对象。在C++类中,每个非静态成员函数都有一个this指针,它可以访问当前对象的成员变量和成员函数。 二、 this指针的语法 在C++类…

    C 2023年5月22日
    00
  • C 存储类

    C 语言中的存储类指的是控制变量存储方式和生命周期的关键字。局部变量、全局变量和静态变量等都可以使用存储类关键字进行控制,以达到更加灵活的变量存储方式和更加符合实际需要的生命周期等效果。通常使用的存储类关键字有 auto、register、static、extern 四种。 下面我们来详细介绍一下“C 存储类”的使用攻略。 auto 存储类 auto 存储类…

    C 2023年5月10日
    00
  • C 程序 十进制转换为八进制

    下面是 “C 程序 十进制转换为八进制” 的完整使用攻略。 一、题目要求 编写一个 C 程序,将用户输入的十进制数转换为八进制数,并输出转换后的结果。 二、解题思路 获取用户输入的十进制数。 将十进制数转化为八进制数。 打印输出结果。 三、代码实现 #include <stdio.h> int main() { int decimal, rema…

    C 2023年5月9日
    00
合作推广
合作推广
分享本页
返回顶部