今天做到了Tyvj的初学者题库Q1077:http://www.tyvj.cn/Open_Problem_Show.aspx?id=1077
2009-07-10 07-10
365
#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的!
呀呀,这次真的去吃饭了,快没菜了,啊啊啊啊,卡里也快没钱了······~