您的位置:首页 > 其它

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

2013-05-28 01:32 239 查看
很恶心的模拟题.......不过编完后,有着一些收获,以后的年月日题目都可以以这个代码为模板了。

注意:这道题目加日期很好编,只要注意每次在加的时候,在月的时候,先转为某个月份的最后一天,然后再去判断大于这个的月份就直接减去这个月份,在年的转化中,都将它转为****/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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: