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

该博客介绍了如何将北京时间转换为百度时间,其中百度时间是从2000年1月1日开始计算的正整数天数。博客提供了输入数据格式,并通过示例说明了闰年的判断规则,以及正确和错误的转换输出情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

百度时间   

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

现在就请大家设计一个程序将北京时间转换为百度时间。在本题中,闰年的年份是400的倍数,或者是4的倍数但不是100的倍数。比如20008888均为闰年,但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;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值