您的位置:首页 > 其它

百度时间(2007年百度之星初赛第一题)

2012-11-11 21:03 295 查看
百度时间

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

现在就请大家设计一个程序将北京时间转换为百度时间。在本题中,闰年的年份是400的倍数,或者是4的倍数但不是100的倍数。比如2000和8888均为闰年,但6100不是。

输入格式

输入数据的每一行为一个待转化的北京时间(不含空格和TAB),正确的格式包括两种:

一种为:YYYY-MM-DD,(YYYY表示四位数年份,MM为两位月份,DD为两位日期);

另一种为:MM/DD/YYYY,(YYYY表示四位数年份,MM为两位月份,DD为两位日期);

输出格式

每个数据输出一行。如果可以成功转换,输出一个正整数,否则输出Error。

输入样例 例

2000-01-01

AStar2007

05/26/2007

输出样例 例

0

Error

2702

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define OK 1
#define ERROR 0
#define status int

typedef struct data
{
int year;
int mouth;
int day;
}data;

status get_y_m_d(char *data,int &year,int &mouth,int &day);
int get_data(int year,int mouth,int day);
status isnum(char ch);
status isrunnian(int year);
int main()
{
int i,j;
int year,mouth,day;
char data[100][20];
for(i=0;i<100;i++)
data[i][0]='\0';
year=mouth=day=0;
for(i=0;i<100;i++)
{
scanf("%s",data[i]);
data[i][strlen(data[i])]='\0';
//getchar();
if(data[i][0]=='#')
break;
}
for(j=0;j<i;j++)
{
if(get_y_m_d(data[j],year,mouth,day)==OK)
printf("%d\n",get_data(year,mouth,day));
else
printf("Error\n");
}
system("pause");
return 0;
}
status isnum(char ch)
{
if(ch>='0'&&ch<='9')
return OK;
else
return ERROR;
}
status get_y_m_d(char *data,int &year,int &mouth,int &day)
{
int i;
year=mouth=day=0;
if(data[2]=='/'&&data[5]=='/')//  MM/DD/YYYY 格式的,暂时认为
{
if(strlen(data)!=10)
return ERROR;
else
{
if(isnum(data[0])&&isnum(data[1]))//mm
if(isnum(data[3])&&isnum(data[4]))//dd
if(isnum(data[6])&&isnum(data[7])&&isnum(data[8])&&isnum(data[9]))//yyyy
{
mouth=(data[0]-'0')*10+(data[1]-'0');
day=(data[3]-'0')*10+(data[4]-'0');
year=(data[6]-'0')*1000+(data[7]-'0')*100+(data[8]-'0')*10+(data[9]-'0');
return OK;
}
return ERROR;

}
}
else if(data[4]=='-'&&data[7]=='-')//YYYY-MM-DD 格式的,暂时认为
{
if(strlen(data)!=10)
return ERROR;
else
{
if(isnum(data[0])&&isnum(data[1])&&isnum(data[2])&&isnum(data[3]))//yyyy
if(isnum(data[5])&&isnum(data[6]))//mm
if(isnum(data[8])&&isnum(data[9]))//dd
{
year=(data[0]-'0')*1000+(data[1]-'0')*100+(data[2]-'0')*10+(data[3]-'0');
mouth=(data[5]-'0')*10+(data[6]-'0');
day=(data[8]-'0')*10+(data[9]-'0');
return OK;
}
return ERROR;

}
}
else
return ERROR;
}
int get_data(int year,int mouth,int day)
{
int i;
int count;
count=0;
for(i=2000;i<year;i++)
if(isrunnian(i)==OK)
count+=366;
else
count+=365;
if(mouth<=2)
count+=((mouth-1)*31+day);
else
{
switch(mouth)
{
case 3:count+=(31+29+day); break;
case 4:count+=(31+29+31+day);break;
case 5:count+=(31+29+31+30+day);break;
case 6:count+=(31+29+31+30+31+day);break;
case 7:count+=(31+29+31+30+31+30+day);break;
case 8:count+=(31+29+31+30+31+30+31+day);break;
case 9:count+=(31+29+31+30+31+30+31+31+day);break;
case 10:count+=(31+29+31+30+31+30+31+31+30+day);break;
case 11:count+=(31+29+31+30+31+30+31+31+30+31+day);break;
case 12:count+=(31+29+31+30+31+30+31+31+30+31+30+day);break;
}
if(!isrunnian(year))
count--;
}
return count-1;//2000-01-01为第一天
}
status isrunnian(int year)
{
if(year%400==0||(year%4==0&&year%100!=0))
return OK;
return ERROR;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: