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

                       

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

思路:用两套数组分别存储每个月的天数,分别是闰年和非闰年,分别为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");}
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值