问题 A: 日期差值
题目描述
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。
输入
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出
每组数据输出一行,即日期差值
样例输入
20130101
20130105
样例输出
5
运行超时:
#include<stdio.h>
struct date{
int y,m,d;
};
bool isleap(int year)
{
bool leap = false;
if((year%4==0&&year%100==0)||year%400==0)
leap = true;
return leap;
}
int main()
{
int date1,date2;//初始化为1可以避免最后还要加1
int month[13][2]={
{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},
{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}
};//2D数组,分别表示平年闰年的每个月的天数
while(scanf("%d%d",&date1,&date2)!=EOF){
if(date1>date2){
int t=date1;date1=date2;date2=t;
}
int result=1;
struct date a={date1/10000,date1/100%100,date1%100};
struct date b={date2/10000,date2/100%100,date2%100};
while(a.y<b.y||a.m<b.m||a.d<b.d){
a.d++;
if(a.d==month[a.m][isleap(a.y)]+1){
a.m++;
a.d=1;
}
if(a.m==13){
a.y++;
a.m=1;
}
result++;
}
printf("%d\n",result);
}
return 0;
}
废了老鼻子劲了才写好:
#include<stdio.h>
bool isleap(int year)
{
bool leap = false;
if((year%4==0&&year%100!=0)||year%400==0)
leap = true;
return leap;
}
int main()
{
struct date{
int y,m,d;
}a,b;
int date1,date2;
int month[13][2]={
{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},
{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}
};//2D数组,分别表示平年闰年的每个月的天数
while(scanf("%d%d",&date1,&date2)!=EOF){
if(date1>date2){
int t=date1;date1=date2;date2=t;
}
int result=0;
struct date a={date1/10000,date1/100%100,date1%100};
struct date b={date2/10000,date2/100%100,date2%100};
if(a.y!=b.y){//异年
result += month[a.m][isleap(a.y)] - a.d+1;//a.d月到月底的天数
result += b.d; //月初到 b.d的天数
for(int i=a.y+1;i<b.y;i++){//计算中间年的天数
if(isleap(i)){
result+=366;
}
else result+=365;
}
while(a.m+1<=12){//a.m的下一个月开始到本年的12月的天数
result+=month[a.m+1][isleap(a.y)];
a.m++;
}
for(int i = 1;i<b.m;i++){//1月开始到b.m-1月的天数
result+=month[i][isleap(b.y)];
}
}
else if(a.m!=b.m){//同年异月
result += month[a.m][isleap(a.y)] - a.d+1;//a.d月到月底的天数
result += b.d;//月初到 b.d的天数
for(int i=a.m+1;i<b.m;i++){//中间月的天数
result+=month[i][isleap(a.y)];
}
}
else{//同年同月
result += b.d-a.d+1;
}
printf("%d\n",result);
}
return 0;
}