下一个生日要多久

今天做到了Tyvj的初学者题库Q1077:http://www.tyvj.cn/Open_Problem_Show.aspx?id=1077

描述 Description

对小孩子来说,,生日算是最欢乐的一件事了..

……

告诉你现在的日期,,和这个孩子的生日
你能算出离现在最近的下一个生日
还有多少天么?

输入格式 InputFormat

第一行,一个日期,格式为年-月-日
第二行,也是一个日期,格式为月-日
两个日期不足2位都高位补零

输出格式 OutputFormat

一行,一个整数,表示还有多少天

样例输入 SampleInput [复制数据]

2009-07-10
07-10

样例输出 SampleOutput [复制数据]

365

数据范围和注释 Hint

[样例解释]
注意是下一个..!
先贴自己的代码:

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

bool isLeapYear(int y)
{
	if(y%4==0)
	{
		if(y%100==0)
		{
			if(y%400==0) return true;
			else return false;
		}
		else return true;
	}
	else return false;
}

int UpperDay(int y, int m)
{
	if(m==2&&isLeapYear(y)) return 29;
	switch(m)
	{
		case 2: return 28;
		case 4:
		case 6:
		case 9:
		case 11: return 30;
		default: return 31;
	}
}

void AddOneDay(int& y,int& m, int& d)
{
	if(d<UpperDay(y,m)) ++d;
	else
	{
		if(m==12)
		{
			m = 1;
			++y;
		}
		else ++m;
		d = 1;
	}
}

int main()
{
	string now;
	cin >> now;
	int y, m, d;
	y = (now[0]-'0')*1000 + (now[1]-'0')*100 + (now[2]-'0')*10 +(now[3]-'0');
	m = now[6] - '0';
	m += (now[5]-'0')*10;
	d = now[9] - '0';
	d += (now[8]-'0')*10;
	string birth;
	cin >> birth;
	int mon, day;
	mon = birth[1]-'0';
	mon += (birth[0]-'0')*10;
	day = birth[4]-'0';
	day += (birth[3]-'0')*10;
	int cnt = 0;
	if(m==mon&&d==day)
	{
		AddOneDay(y,m,d);
		++cnt;
	}
	while(m!=mon||d!=day)
	{
		AddOneDay(y,m,d);
		++cnt;
	}
	cout << cnt << endl;
	return 0;
}

这个嘛,其实本来也想归入“模拟算法”的分类的,但是想想,算了,虽然本质是模拟算法,但是还是放到日期这里来吧!

模拟的是加一天的,由于是模拟现实的规律,代码一看就懂了,就不多做无聊的解释了。

值得注意的是,在传参数的时候记得用引用,月份和日期要用引用,这个很容易理解,因为在main函数里面是根据它们的变化来终止循环的!

但是年份为什么要用引用呢?哈哈,这个你自己是试一下这个数据:

2012-02-29

02-29

就知道了,因为如果年份不跟随月份和天数变化的化,它在判断闰年等地方就会出错,我也是wa了一次,才找到这个bug的!

呀呀,这次真的去吃饭了,快没菜了,啊啊啊啊,卡里也快没钱了······~

你可能感兴趣的:(ACM)