下一个生日要多久

今天做到了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的!

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值