如题所示,这个算法就是写起来麻烦一点,不过还是很简单的,思路清晰就非常好做
思路:用两套数组分别存储每个月的天数,分别是闰年和非闰年,分别为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/