磐安住房和城乡建设部网站/百度新闻网
题目描述
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;
}