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;

} 

 

 

你可能感兴趣的:(HDU)