暴力玩家也有春天!!!
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。
输入格式
输入包含多组测试数据。
每组数据占两行,分别表示两个日期,形式为 YYYYMMDD
。
输出格式
每组数据输出一行,即日期差值。
数据范围
年份范围 [1,9999][1,9999],
保证输入日期合法。
测试数据的组数不超过 100100。
输入样例:
20110412
20110422
输出样例:
11
这个题的麻烦之处在于需要考虑的细节点非常多,比如闰年,闰年的年份如何判断,我一开始是让year%4==0就判断为闰年,但是这样不对,到后边运行出错,必须得是(year%4==0&&year%100!=0)||year%400==0,这个判断真的很奇怪,也很费解,我的建议是背过。还有对于年份岔开的情况中间遇到有闰年该怎么处理
回顾整体思路,就是先依次提取出年,和换算成当年的总体days,然后算中间完整的年的总days数,然后判断一下是否闰年,将起始年距离年底的days数目加上,再将结束年距离年初的days加上,对的,最后就得出总体的days数目,别忘了该+1的时候+1嗷,真的很细节,但是你要是真的想暴力,是可以暴力出来的。
暴力玩家们请继续前行吧!话不多说,上代码!
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int run_year(int year)
{
if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
{
return 1;
}
else return -1;
}
int trans_day(int date)
{
int days=0;
int date_day=date%100;
date=date/100;
int date_month=date%100;
date/=100;
int date_year=date;
for(int i=1;i<date_month;i++)
{
if(i==2&&run_year(date_year)==1)
{
days+=29;
}
if(i==2&&run_year(date_year)==-1)
{
days+=28;
}
if(i==1||i==3||i==5||i==7||i==8||i==10)
{
days+=31;
}
if(i==4||i==6||i==9||i==11)
{
days+=30;
}
}
days=days+date_day;
return days;
}
int trans_year(int date)
{
return date/10000;
}
//void chazhi(int a,int b)
//{
// int a_day=a%100;
// a=a/100;
// int a_month=a%100;
// a/=100;
// int a_year=a;
//
// int b_day=b%100;
// b=b/100;
// int b_month=b%100;
// b/=100;
// int b_year=b;
//
// for(int i=a_year;i<=b_year;i++)
// {
// if(run_year_)
// }
//}
int main()
{
int a,b;
while(scanf("%d %d",&a,&b)!=EOF)
{
int a_days=trans_day(a);
int b_days=trans_day(b);
int a_year=trans_year(a);
int b_year=trans_year(b);
//printf("%d %d\n",a_days,b_days);
int min_year=min(a_year,b_year);
int max_year=max(a_year,b_year);
if(a_year==b_year)
{
printf("%d\n",abs(b_days-a_days)+1);
}
else
{
int cnt_days=0;
for(int i=min_year+1;i<max_year;i++)
{
if(run_year(i)==1)
{
cnt_days+=366;
}
else
{
cnt_days+=365;
}
}
if(min_year==a_year)
{
if(run_year(a_year)==1)
{
cnt_days+=366-a_days+1+b_days;
}
else cnt_days+=365-a_days+1+b_days;
}
else
{
if(run_year(b_year)==1)
{
cnt_days+=366-b_days+1+a_days;
}
else cnt_days+=365-b_days+1+a_days;
}
printf("%d\n",cnt_days);
}
}
}