hdu4515小Q系列故事——世界上最遥远的距离(几点注意的地方以及测试数据)

很恶心的模拟题.......不过编完后,有着一些收获,以后的年月日题目都可以以这个代码为模板了。

注意:这道题目加日期很好编,只要注意每次在加的时候,在月的时候,先转为某个月份的最后一天,然后再去判断大于这个的月份就直接减去这个月份,在年的转化中,都将它转为****/12/31,再去一年一年的加减.......

加法的测试数据:
38
39
282
283
7
8
减法的时候,就要注意好多了,我一开始按照加法的细节处理来处理减法,发现各种细节错误,在月份的时候,要转为钱一个月的最后一天,就是当day “大于等于"这个月份的时候,将这个月份减去(注意,这里不同于加法),这样可以避免出现2013/02/00的情况,在转化年的时候,要转为前一年的12/31,避免出现2013/01/00这种情况

减法测试数据:
52
87345
24
23
100000

下面是代码:

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int main()
{
	int s[300],t[300],a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	s[0]=282;
	t[0]=83;                               
	int sum=282;                         //这是加法的初始值,你会发现,加上282天就是2013、12、31 
	for(int i=2014;i<=2013+298;i++)
	{
		if(i%4==0&&i%100!=0||i%400==0)
		sum+=366;
		else
		sum+=365;
		s[i-2013]=sum;
	}
	sum=83;                            //这是减法的初始值,你会发现,减去83就是2012、12、31 
	for(int i=2012;i>=2013-298;i--)
	{
		if(i%4==0&&i%100!=0||i%400==0)
		sum+=366;
		else
		sum+=365;
		t[2013-i]=sum;
	}
	int text;
	scanf("%d",&text);
	while(text--)
	{
		int day;
		scanf("%d",&day);
		int day1=day;
		int year,mon,i=0;
		for(;i<=298;i++)
		if(day<=s[i])           //注意,这里去加法的算法,与减法不同 
		break;
		year=i+2013;
		if(i==0)
		{
			if(day<=31-24)
			{
				mon=3;
				day=24+day;
			}
			else
			{
				day-=7;
				int j;
				for(j=4;j<=11;j++)
				if(day>a[j])            //注意.....区别减法 
				day-=a[j];
				else
				break;
				mon=j;
			}
		}
		else
		{
			day-=s[i-1];
			if(s[i]-s[i-1]==366)
			a[2]++;
			int j;
			for(j=1;j<=11;j++)
			if(day>a[j])
			day-=a[j];
			else
			break;
			mon=j;
			if(s[i]-s[i-1]==366)
			a[2]--;
		}
		printf("%04d/%02d/%02d ",year,mon,day);
		day=day1;
		i=0;
		for(;i<=298;i++)
		if(day<t[i])                               //不同之处....... 
		break;
		year=2013-i;
		if(i==0)
		{
			if(day<=24-1)
			{
				mon=3;
				day=24-day;
			}
			else
			{
				day-=24;
				int j;
				for(j=2;j>=1;j--)
				if(day>=a[j])                        //不同之处 
				day-=a[j];
				else
				break;
				mon=j;
				day=a[j]-day;
			}
		}
		else
		{
			day-=t[i-1];
			//printf("\n%d\n",day);
			if(t[i]-t[i-1]==366)
			a[2]++;
			int j=12;
			for(;j>=2;j--)
			if(day>=a[j])                 //注意 
			day-=a[j];
			else
			break;
			mon=j;
			//printf("%d\n",day);
			day=a[j]-day;
			//printf("\n%d %d\n",day,a[j]);
			if(t[i]-t[i-1]==366)
			a[2]--;
		}
		printf("%04d/%02d/%02d\n",year,mon,day);
	}
	return 0;
} 

 

 

posted @ 2013-05-28 01:32  紫忆  阅读(438)  评论(0编辑  收藏  举报