今天做到了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的!
呀呀,这次真的去吃饭了,快没菜了,啊啊啊啊,卡里也快没钱了······~