首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2012-11-23 
百度时间(2007年百度之星初赛第一题)百度时间Baidu的服务器上使用的不是北京时间,而是Baidu时间。Baidu时间

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

百度时间   

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 inttypedef 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));elseprintf("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]))//mmif(isnum(data[3])&&isnum(data[4]))//ddif(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]))//yyyyif(isnum(data[5])&&isnum(data[6]))//mmif(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;}}elsereturn 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;elsecount+=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;}


热点排行