题目描述
Baidu 的服务器上使用的不是北京时间,而是 Baidu 时间。 Baidu 时间的时分秒与北京时间相同,但是日期与北京时间不同,是用一个正整数表示从 2000 年 1 月 1 日 起的第几天。
现在就请大家设计一个程序将北京时间转换为百度时间。
输入格式
输入数据的每一行为一个待转化的北京时间,格式包括两种:
一种为: YYYY-MM-DD ,( YYYY 表示四位数年份, MM 为两位月份, DD 为两位日期);
另一种为: MM/DD/YYYY ,( YYYY 表示四位数年份, MM 为两位月份, DD 为两位日期);
不符合任何一种格式的输入视为非法输入。
输出格式
每个数据输出一行。如果格式正确,输出一个正整数,否则输出 Error 。
输入样例
2006-03-21
AStar2007
04/22/2007
输出样例
2149
Error
2463
my answer:
明明 是很简单的一道题,搞不懂它的输出样例是怎么算出来的
#include <iostream> using namespace std; char ch[11]; int m[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; bool IsRun(int x); int main() { while(cin>>ch) { int time[3] = {0}, j = 0, cnt = 0, i; while(ch[j] != '\0' && cnt < 3) { if(ch[j] >= '0' && ch[j] <= '9') { time[cnt] = time[cnt] * 10 + ch[j] - '0'; } else cnt++; j++; } int year, month, day; if(ch[2] == '/') { month = time[0]; day = time[1]; year = time[2]; } else { year = time[0]; month = time[1]; day = time[2]; } if(year < 2000 || year > 9999 || month <= 0 || month > 12 || day <= 0 || day > 31) { cout<<"Error"<<endl; continue; } int ret = 0; for(i = 2000; i < year; i++) { ret = ret + 365; if(IsRun(i)) ret++; } for(i = 1; i < month; i++) { ret = ret + m[i]; if(IsRun(year)) ret++; } if(IsRun(year) && month == 2 && day <= 29) ret = ret + day; else if((!IsRun(year) || month != 2) && day <= m[month]) ret = ret + day; else { cout<<"Error"<<endl; continue; } ret--; cout<<ret<<endl; } return 0; } bool IsRun(int year) { if(year % 4) return 0; if(year % 100) return 1; if(year % 400) return 0; return 1; }