有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天
输入描述
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出描述
每组数据输出一行,即日期差值
输入样例
20110412
20110422
输出样例
11
分析:本题需要考虑三种情况:①同年(同月否?)计算②最后一年计算(同月否?)③中间间隔的完整年份的计算
在解题时为方便字符串与数字之间的转换,本人用到了STL库的stoi函数将字符串快速转换成整数,在这里详细介绍一下相关的几个函数:
①atoi函数
atoi()参数是 const char* 类型的,因此可以将一个字符数组转换成一个数字。但是如果将一个string类型的字符串转换成数字的话,这时我们需要先调用string类成员方法**.c_str()*将其转换为const char 类型后,再进行转换。
cout<<atoi(a.c_str());
②stoi函数
stoi()参数是 const string& 类型的,因此可以将一个string类型的字符串转换成一个数字。
PS:stoi()会做范围检查,默认范围在int范围内(因为返回的是int类型),如果超出范围的话则会runtime error!
atoi()则不会做范围检查,如果超出范围的话,超出上界,则输出上界,超出下界,则输出下界。请看代码:
代码如下:
#include<bits/stdc++.h>
#include<cstring>
using namespace std;
int main(){
string date1,date2;
cin>>date1>>date2;
int y1 = stoi(date1.substr(0,4));
int m1 = stoi(date1.substr(4,2));
int d1 = stoi(date1.substr(6));
int y2 = stoi(date2.substr(0,4));
int m2 = stoi(date2.substr(4,2));
int d2 = stoi(date2.substr(6));
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int count = 1;
int flag = 1;
if(y1==y2)
flag = 0;
for(int y=y1 ; y<=y2 ; y++){
if((y%4==0&&y%100!=0)||(y%400==0))
a[2]+=1;
if(y==y2&&flag==1){//在最后一年且并非同一年
for(int m=1 ; m<=m2 ; m++){
if(m==m2)//最后一个月
count+=d2;
else
count+=a[m];
}
}
else if(y!=y2&&y!=y1&&flag==1){//在中间年份且并非同一年
if(a[2]==28)
count+=365;
else
count+=366;
}
else if(y==y1&&flag==1){//在第一年且并非同一年
count=count+(a[m1]-d1+1);
for(int m=m1+1 ; m<=12 ; m++)
count+=a[m];
}
else if(flag==0){//在同一年
if(m1==m2)//如果是同一个月
count=count+(d2-d1);
else{
count=count+(a[m1]-d1+1);
for(int m=m1+1 ; m<m2 ; m++)
count+=a[m];
count+=d2;
}
}
}
cout<<count;
return 0;
}