算法竞赛--日期处理

1.日期差值

有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。

输入信息:

有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD

输出信息:

每组数据输出一行,即日期差值

样例输入:

1
2
20130101
20130105

样例输出:

1
5

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>	
int month[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};//用数组存储1-12月的天数
bool Isleap(int year) //判断是否是闰年
{
return ((year%4==0&&year%100!=0)||(year%400==0));
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)==2)
{
if(n>m) //如果n大于m,则交换两个日期值
{
int temp=n;
n=m;
m=temp;
}
int year1,year2,month1,month2,day1,day2;//分别求出两个日期对应的年月日
long long days=1; //统计天数要用long long型
year1=n/10000;
month1=n/100%100;
day1=n%100;
year2=m/10000;
month2=m/100%100;
day2=m%100;
while(year1<year2||month1<month2||day1<day2)//从日期n一直加到日期m,统计天数
{
day1++;
if(day1==month[month1][Isleap(year1)]+1)
{
month1++;
day1=1;
}
if(month1==13)
{
year1++;
month1=1;
}
days++;
}
printf("%lld\n",days);
}
return 0;
}

2.打印日期

给出年分m和一年中的第n天,算出第n天是几月几号。

输入信息:

输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。

输出信息:

可能有多组测试数据,对于每组数据,按 yyyy-mm-dd的格式将输入中对应的日期打印出来。

样例输入:

1
2
3
4
2013 60
2012 300
2011 350
2000 211

样例输出:

1
2
3
4
2013-03-01
2012-10-26
2011-12-16
2000-07-29

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
int month[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};//用数组存储1-12月的天数
bool Isleap(int year) //判断是否是闰年
{
return (year%4==0&&year%100!=0)||(year%400==0);
}
int main()
{
int y,n,m,d;
while((scanf("%d%d",&y,&n))==2){
int days=0,yy=Isleap(y);
for(int i=1;i<13;i++){
days+=month[i][yy];
if(days>=n){
m=i; //记录第一个days大于n,i即为月份,days-该月份总天数与n的差值即为日。
d=n-(days-month[i][yy]);
break;
}
}
printf("%04d-%02d-%02d\n",y,m,d);//该题的一个坑,注意输出格式,年占四位,月日占两位,注意补零,WA50%
}
return 0;
}

3.日期类

编写一个日期类,要求按xxxx-xx-xx 的格式输出日期,实现加一天的操作。

输入信息:

输入第一行表示测试用例的个数m,接下来m行每行有3个用空格隔开的整数,分别表示年月日。测试数据不会有闰年。

输出信息:

输出m行。按xxxx-xx-xx的格式输出,表示输入日期的后一天的日期。

样例输入:

1
2
3
2
1999 10 20
2001 1 31

样例输出:

1
2
1999-10-21
2001-02-01

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<stdio.h>
int year[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
int n,y,m,d;
scanf("%d",&n);
while(n--)
{
scanf("%d%d%d",&y,&m,&d);
d++;
if(d==year[m]+1)//天数加1后超出该月天数
{
m++;
d=1;
}
if(m==13)//天数加1后,引起月份完全等于13,年份加1.
{
y++;
m=1;
}
printf("%04d-%02d-%02d\n",y,m,d);//注意输出格式。
}
return 0;
}

4.日期累加

设计一个程序能计算一个日期加上若干天后是什么日期。

输入信息:

输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数。

输出信息:

输出m行,每行按yyyy-mm-dd的个数输出。

样例输入:

1
2
1
2008 2 3 100

样例输出:

1
2008-05-13

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<stdio.h>
int month[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};
bool Isleap(int year)
{
return ((year%4==0&&year%100!=0)||(year%400==0));
}
int main()
{
int n,y,m,d,count;
scanf("%d",&n);
while(n--)
{
scanf("%d%d%d%d",&y,&m,&d,&count);
while(count--) //该题为3的变式,累加count次即可
{
d++;
if(d==month[m][Isleap(y)]+1)
{
m++;
d=1;
}
if(m==13)
{
y++;
m=1;
}
}
printf("%04d-%02d-%02d\n",y,m,d);
}
return 0;
}

5.日期计算

已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况。尤其是逢百年不闰,逢400年闰的情况。

输入信息:

输入只有一行
YYYY MM DD

输出信息:

输出只有一行
W

样例输入:

1
2011 11 11

样例输出:

1
5

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include<stdio.h>
int month[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};
bool Isleap(int year)
{
return ((year%4==0&&year%100!=0)||(year%400==0));
}
int main()
{
int date1=20111111,date2,y1=2011,m1=11,d1=11,y,m,d;
long long count=0;
scanf("%d%d%d",&y,&m,&d);
date2=y*10000+m*100+d;
if(date2<date1)//如果输入的日期比20111111小的话,进行交换,始终保持date2>date1,才可计算两个日期的差值。
{
y1=y;
m1=m;
d1=d;
y=2011;
m=11;
d=11;
}
while(d1<d||m1<m||y1<y)
{
d1++;
if(d1==month[m1][Isleap(y1)]+1)
{
m1++;
d1=1;
}
if(m1==13)
{
y1++;
m1=1;
}
count++; //对两个日期的差值进行计数。
}
int week;
if(date2>=date1)//若输入的数大于20111111,从星期五开始,加上差值模7就可
week=(count+5)%7;
else//否则从星期五开始减。
week=(7-(count+2)%7);
if(week==0)//若week==0,为星期日,输出7。
week=7;
printf("%d",week);
return 0;
}
小礼物走一个哟
0%