最近在读《算法笔记》
其中有条题来自codeup,觉得挺有趣,想来练手。
没想到会想了很久,但我又不想用书本写好的现成代码,想看看自己能走多远。
题目描述
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。
输入
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出
每组数据输出一行,即日期差值
样例输入
20130101
20130105
样例输出
5
#include <stdio.h>
typedef struct Date
{
int str;
int year;
int month;
int day;
}Date;
int isLeap(int year);
void AdjustStrToDate(Date *date);
int main()
{
int days[]={0,31,28,31,30,31,30,31,31,30,31,30,31},dayCount=1;
Date dates[2],temp;
while(scanf("%d%d",&dates[0].str,&dates[1].str)!=EOF)
{
if(dates[0].str>dates[1].str)
{
temp = dates[0];
dates[0] = dates[1];
dates[1] = temp;
}
AdjustStrToDate(&dates[0]);
AdjustStrToDate(&dates[1]);
//1.若是不同年或者不同月,先整理当月剩下的日子
if(dates[0].year!=dates[1].year||dates[0].month!=dates[1].month)
{
dayCount+=days[dates[0].month]-dates[0].day;
dates[0].day=1;
dayCount++;//这里加1是因为它到了第二个月份的一号,那个一号属于算进去的一天
//先处理两个特殊月份
if(dates[0].month==2&&isLeap(dates[0].year))
{
//又是2月又是闰年
dayCount++;
dates[0].month++;
}
else if(dates[0].month==12)
{
dates[0].year++;
dates[0].month=1;
}
else
dates[0].month++;
}
//2.若是不同年 ,先搞到同年为止
while(dates[0].year!=dates[1].year)
{
for(;dates[0].month<=12;dates[0].month++)
{
dayCount+=days[dates[0].month];
if(dates[0].month==2&&isLeap(dates[0].year))
dayCount++;
}
dates[0].year++;
dates[0].month=1;
}
//3.若是不同月 ,先搞到同月为止
for(;dates[0].month<dates[1].month;dates[0].month++)
{
dayCount+=days[dates[0].month];
if(dates[0].month==2&&isLeap(dates[0].year))
dayCount++;
}
//4.到这里,已然同年同月,就计算日子了
dayCount += dates[1].day -dates[0].day;
printf("%d\n",dayCount);
dayCount=1;//因为codeup是个多点测试,输出完本次用例就重置关键变量
}
return 0;
}
int isLeap(int year)
{
if((year%4==0&&year%100!=0)||year%400==0)
return 1;
return 0;
}
void AdjustStrToDate(Date *date)
{
date->year = date->str/10000;
date->month = date->str%10000/100;
date->day = date->str%100;
}