有两个日期,求两个日期之间的天数

题目描述

有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天
输入描述:
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD

输出描述:
每组数据输出一行,即日期差值

示例1
输入

20110412
20110422

输出

11

代码

#include <iostream>
#include <cstdio>
#include <string>
#include <math.h>

using namespace std;

int datas[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},
                  {31,29,31,30,31,30,31,31,30,31,30,31}};
int isLeapYear(int year){
    return (year%4==0&&year%100!=0)||year%400==0;
}
int numberOfYear(int year){
    if(isLeapYear(year)) 
        return 366;
    else 
        return 365;
}
// 思路就是 年计算相对值,日期计算本年的值,然后多的年日期-少的年日期;+年的日子;
int main(){
    string time1;
    string time2;
    int year,month,day,year2,month2,day2;
    while(getline(cin,time1)&&getline(cin,time2)){
        int num=1; //更好的读入方法:
        int flag = time1.compare(time2);
        year=stoi(time1.substr(0,4));
        year2=stoi(time2.substr(0,4));
        month=stoi(time1.substr(4,2));
        month2=stoi(time2.substr(4,2));
        day=stoi(time1.substr(6,2));
        day2=stoi(time2.substr(6,2));
        
        int numOfYear=abs(year-year2);
        // 函数化处理:
        int num1,num2;
        num1=num2=0;
        for(int i=0;i<month-1;i++){
            num1+=datas[isLeapYear(year)][i];
        }
        num1+=day;
         for(int i=0;i<month2-1;i++){
            num2+=datas[isLeapYear(year2)][i];
        }
        num2+=day2;
        if(flag>0){// first is biger
            while(numOfYear>0){
                num+=numberOfYear(year);
                year--;
                numOfYear--;
            }
            num+=(num1-num2);
        }else{
             while(numOfYear>0){
                num+=numberOfYear(year);
                year++;
                numOfYear--;
            }
            num+=(num2-num1);
        }
        printf("%d\n",num);
    }
    
    return 0;
}

优秀答案:

#include<stdio.h>
#define leap(x) (x%400==0||(x%4==0&&x%100!=0)?1:0)
#define Abs(x) ((x)>0?(x):-(x))
typedef struct date
{
    int y, m, d;
}Date;

const int yd[2][13]={{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
                     {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
                      
int days(Date x)
{
    int sum=0, i;
    int y=x.y, m=x.m, d=x.d;
    for(i=0; i<y; i++)
    {
        if(leap(i))
        {
            sum+=366;
        }
        else
        {
            sum+=365;
        }
    }
    for(i=1; i<m; i++)
    {
        sum+=yd[leap(y)][i];
    }
    sum+=d;
    return sum;
}
// 计算日期相对于0000 00 00 的日子;
int main(void)
{
    Date a, b;
    while(scanf("%4d%2d%2d", &a.y, &a.m, &a.d)!=EOF) //读取固定的格式数据:
    {
        scanf("%4d%2d%2d", &b.y, &b.m, &b.d);
        printf("%d\n", Abs(days(a)-days(b))+1);
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值