给定两个年月日,计算之间相隔的天数(数学)

简介: 给定两个年月日,计算之间相隔的天数(数学)

加入给你两个年月日的日期,让你计算它们两个之间共有多少天,我们可以分为以下几种情况:↓↓↓


1.两个年份相等:首先判断是否为闰年,接下来,


  ①如果对应的月份也相等,直接用大的天数减去小的天数。例如:2000.01.01和2000.01.06,就直接6-1=5天。


  ②如果对应的月份相差等于1,就用小的月份总天数减去对应已有的小的月份的天数,然后再加上大的月份已有的天数。例如:2000.01.02和2000.02.03,就是用31-2+3=32天。


  ③如果对应的月份相差大于1,先按照②的方法算出两头的天数,然后用for循环去依次累加中间那些满天数的月份即可。例如:2000.01.02和2000.03.05,就是31-2+5+29=63天。


2.两个年份相差等于1:首先仍然要判断是否为闰年,接下来,


  ①先计算数值小的年份,用for循环依次累加数值小的年份的满天数的月份(这些月份全部走过),然后用这一年的总天数(366或者365)减去已经过去的满天数的月份,再减去当前要求计算的较小的日期对应月份的天数。


  ②再计算数值大的年份,用for循环依次累加这一年满天数的月份,然后再加上要求计算的较大的日期对应的月份的天数。然后再加上数值大的年份的天数即可。例如:2000.02.02和2001.02.05,就是366-31-2+31+5=369。


3.两个年份相差大于1:首先按照2的方法计算两头的天数,接下来:


  ①用for循环去依次累加(year1,year2)区间内年份的天数,如果是闰年就加上366,平年就加上365就可以了。例如:2000.02.05和2003.03.07,就是366-31-5+31+28+7+365+365=1126。

注:我的输入保证第二个日期大于第一个日期。


程序代码:


#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int num1[12]={31,29,31,30,31,30,31,31,30,31,30,31};
int num2[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int judge(int year,int month1,int month2,int day1,int day2)
{
  int sum=0;
  if((year%4==0&&year%100!=0)||year%400==0)
  {
    if(month1==month2)
      return day2-day1;
    if((month2-month1)==1)
      return num1[month1-1]-day1+day2;
    if((month2-month1)>1)
    {
      sum=num1[month1-1]-day1+day2;
      for(int i=month1+1;i<=month2-1;i++)
        sum+=num1[i-1];
      return sum;
    }
  }
  else
  {
    if(month1==month2)
      return day2-day1;
    if((month2-month1)==1)
      return num2[month1-1]-day1+day2;
    if((month2-month1)>1)
    {
      sum=num2[month1-1]-day1+day2;
      for(int i=month1+1;i<=month2-1;i++)
        sum+=num2[i-1];
      return sum;
    }
  }
}
int frontday(int year,int month,int day)
{
  int sum=0;
  if((year%4==0&&year%100!=0)||year%400==0)
  {
    for(int i=0;i<month-1;i++)
      sum+=num1[i];
    return sum+day;
  }
  else
  {
    for(int i=0;i<month-1;i++)
      sum+=num2[i];
    return sum+day;
  }
}
int backday(int year,int month,int day)
{
  int sum=0;
  if((year%4==0&&year%100!=0)||year%400==0)
  {
    for(int i=0;i<month-1;i++)
      sum+=num1[i];
    return 366-sum-day;
  }
  else
  {
    for(int i=0;i<month-1;i++)
      sum+=num2[i];
    return 365-sum-day;
  }
}
int main()
{
  int y1,m1,d1,y2,m2,d2,x=0;
  scanf("%d-%d-%d",&y1,&m1,&d1);
  scanf("%d-%d-%d",&y2,&m2,&d2);
  if(y2==y1)
    x+=judge(y1,m1,m2,d1,d2);
  if((y2-y1)==1)
    x+=backday(y1,m1,d1)+frontday(y2,m2,d2);
  if((y2-y1)>1)
  {
    x+=backday(y1,m1,d1)+frontday(y2,m2,d2);
    for(int i=y1+1;i<=y2-1;i++)
    {
      if((i%4==0&&i%100!=0)||i%400==0)
        x+=366;
      else
        x+=365;
    }
  }
  cout<<x<<endl;
  return 0;
}
目录
打赏
0
0
0
0
85
分享
相关文章
求连续整数的阶层的和,时间复杂程度为O(n)的解法
求连续整数的阶层的和,时间复杂程度为O(n)的解法
|
11月前
31.假定2007年的一月一日是星期一,输入一个时间(包含年、月、日),求出它是星期几。
31.假定2007年的一月一日是星期一,输入一个时间(包含年、月、日),求出它是星期几。
75 0
|
11月前
|
C++类相关oj题目分享(计算日期到天数转换、日期差值、打印日期、日期累加)
C++类相关oj题目分享(计算日期到天数转换、日期差值、打印日期、日期累加)
139 0
【每日一题Day99】LC1663具有给定数值的最小字符串 | 贪心
如果k−(n−i)∗26<=1,那么表示尾部全部插入z,没有分数剩余甚至还有同于,那么第i个字符可以插入的最小字符'a',贡献的分数为1
81 0
滑动窗口__最长不含重复字符的子符串_和为S的连续正整数序列(剑指offer)
滑动窗口__最长不含重复字符的子符串_和为S的连续正整数序列(剑指offer)
123 0
滑动窗口__最长不含重复字符的子符串_和为S的连续正整数序列(剑指offer)
解决计算 0:00 到 12:00之间任意一个时间时针和分针的夹角。
解决计算 0:00 到 12:00之间任意一个时间时针和分针的夹角。
181 0
每日算法刷题Day3-起始时间转换、二次方根、while连续输入、斐波那契思路
⭐每日算法题解系列文章旨在精选重点与易错的算法题,总结常见的算法思路与可能出现的错误,与笔者另一系列文章有所区别,并不是以知识点的形式提升算法能力,而是以实战习题的形式理解算法,使用算法。
138 0
给定一个年月日,计算那天是星期几(数学)
给定一个年月日,计算那天是星期几(数学)
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等