下一个生日要多久

来源:互联网 发布:三星电视看网络电视 编辑:程序博客网 时间:2024/05/19 03:16

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

描述 Description

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

……

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

输入格式 InputFormat

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

输出格式 OutputFormat

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

样例输入 SampleInput [复制数据]

2009-07-1007-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
原创粉丝点击