日期差值 C++ 入典!!!

暴力玩家也有春天!!!

有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。

输入格式

输入包含多组测试数据。

每组数据占两行,分别表示两个日期,形式为 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);
	}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值