2007年百度之星程序设计大赛试题初赛题目-题4-百度时间

题目描述 

       Baidu 的服务器上使用的不是北京时间,而是 Baidu 时间。 Baidu 时间的时分秒与北京时间相同,但是日期与北京时间不同,是用一个正整数表示从 2000 年 月 日 起的第几天。 

现在就请大家设计一个程序将北京时间转换为百度时间。 

输入格式 

        输入数据的每一行为一个待转化的北京时间,格式包括两种: 

一种为: 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;
}


你可能感兴趣的:(服务器,百度)