经典算法:计算两个日期之间的天数

如题所示,这个算法就是写起来麻烦一点,不过还是很简单的,思路清晰就非常好做

思路:用两套数组分别存储每个月的天数,分别是闰年和非闰年,分别为num1[] 和 num2[];
**然后就是先计算年和年之间的差距{
相距一年:为第一年的剩下日子+第二年开始的日子
相距一年以上:为初始年的剩下日子+末尾年开始的日子+中间年份日子
相距几个月:计算几个月的日期差
}**

以上思路就是如此,代码也很简单,附上相关注释,一看就懂,不要觉得多,都是一个个的函数,一看就能明白

#include <iostream>
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 frontday(int year,int month,int day){  //计算这年过了多少天了
    int sum=0;
    if((year%100!=0 &&year%4==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%100!=0 &&year%4==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 isyear(int year){ //计算某年是否是闰年,返回不同天数
    if((year%100!=0 &&year%4==0) || year%400==0){
        return 366;
    }
    else return 365;
}
int JudgeMonthDay(int year,int month1,int month2,int day1,int day2){      //计算几个月之间的天数,这个思路同计算不同年之间的天数
        int sum=0;
        if((year%100!=0 &&year%4==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;
            }
        }
}
void main(){
    cout<<"请输入两个日期,分别为年月日,都用空格隔开"<<endl;
    int year1,month1,day1;
    int year2,month2,day2;
    cin>>year1>>month1>>day1>>year2>>month2>>day2;
    int sum=0;    //以下分类讨论计算不同年之间天数
    if((year2-year1)<0) cout<<"应该先输入小的年份,输入错误";
    if((year2-year1)==0){
            cout<<JudgeMonthDay(year1,month1,month2,day1,day2)<<endl;

    }
    if((year2-year1)==1)   cout<<backday(year1,month1,day1)+frontday(year2,month2,day2)<<endl;
    if((year2-year1)>1){
        sum = backday(year1,month1,day1)+frontday(year2,month2,day2);
        for(int i=year1+1;i<=year2-1;i++){
            sum+=isyear(i);
        }
        cout<<sum<<endl;
    }
    system("pause");
}

附上一个可以用来测试的链接地址:
http://day.9om.com/

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值