经典算法:计算两个日期之间的天数
2015-09-05 02:36
513 查看
如题所示,这个算法就是写起来麻烦一点,不过还是很简单的,思路清晰就非常好做
思路:用两套数组分别存储每个月的天数,分别是闰年和非闰年,分别为num1[] 和 num2[];
**然后就是先计算年和年之间的差距{
相距一年:为第一年的剩下日子+第二年开始的日子
相距一年以上:为初始年的剩下日子+末尾年开始的日子+中间年份日子
相距几个月:计算几个月的日期差
}**
以上思路就是如此,代码也很简单,附上相关注释,一看就懂,不要觉得多,都是一个个的函数,一看就能明白
附上一个可以用来测试的链接地址:
http://day.9om.com/
思路:用两套数组分别存储每个月的天数,分别是闰年和非闰年,分别为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/
相关文章推荐
- Android Studio之Gradle多渠道打包
- 如何使用Shiro实现不同用户登录成功后跳转到不同主页?
- 求一元多项式
- LeetCode Invert Binary Tree
- LeetCode Invert Binary Tree
- python 函数的文档字符串 docstrings
- python 循环语句的else语句用法,当循环条件变为假,切不是通过breakbreak终止的时候,就会执行这个else语句。
- 下一跳:使用IP地址与接口的区别
- quick-cocos2dx3.5 mac模拟器改进
- Python爬虫教程——实战二三四五
- BZOJ 3781
- 1.xrange和range不要混了,2.range(len(xx))不如用enumerate
- dragonbones插件编译
- QGis2.9在windows下的编译以及二次开发包下载
- 手游系统逻辑档案之通信协议
- Python爬虫教程——实战一之爬取糗事百科段子
- 关于python 序列 深拷贝
- quick-cocos2dx 3.5集成protobuf
- linux 磁盘文件系统详解
- 随时随地笔记“好学”全程实践(三)- 数据库设计