1290日期差值题目地址
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天输入输出格式
输入描述:
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出描述:
每组数据输出一行,即日期差值
输入样例#:
复制
20110412
20110422
输出样例#:
复制
11
思路分析:根据输入的数字首先要把年月日给确定下来,这里用到了取模和除法运算(很经典)。然后为了方便起见,把前面的那个时间始终保持是较小值。然后对于d1进行累加,中间有两个变化的过程。一个是d1大于某月天数时需要置为1,月份累加1,而当月份累加超过12时,月份置为1,年加一。这样循环,直至赶上第二个较大的日期。则计数器cnt存的值就是两个日期相隔的天数。
本题考察了:数位分解、闰年判断、标记及复位等,是一道不错的考题。
代码:
#include<iostream>
#include <string>
using namespace std;
void reverse_num(int a,int b)
{
if(a>b)
{
int t=a;
a=b;
b=t;
}
}
bool is_leapYear(int n)
{
if((n%400==0)||(n%100!=0)&&(n%4==0))
return 1;
else
return 0;
}
int main()
{
int M[2][13]= {{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
int n1,n2,cnt=1;
while(cin>>n1)
{
cin>>n2;
reverse_num(n1,n2);
int y1=n1/10000,m1=n1%10000/100,d1=n1%100;
int y2=n2/10000,m2=n2%10000/100,d2=n2%100;
int n1=0,n2=0;
while(!(y1==y2&&m1==m2&&d1==d2))
{
int flag=0;
if(is_leapYear(y1))
flag=1;
else
flag=0;
d1++;
cnt++;
if(d1>M[flag][m1])
{
d1=1;
m1++;
if(m1>12)
{
m1=1;
y1++;
}
}
}
cout<<cnt<<endl;
}
return 0;
}