问题 E: 日期累加
时间限制: 1 Sec 内存限制: 32 MB
献花: 45 解决: 32
[献花][花圈][TK题库]
题目描述
设计一个程序能计算一个日期加上若干天后是什么日期。
输入
输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数。
输出
输出m行,每行按yyyy-mm-dd的个数输出。
样例输入
1
2008 2 3 100
样例输出
2008-05-13
计算一个日期加上多少天后的日期,
用month【13】【2】数组存储每个月的天数,使用二维是为了存储平年和闰年的每月天数,然后写一个isleap(int year)函数判断是闰年还是平年,返回值为0或1,使用month【m】【isleap(y)】来计算当月天数,m为第几个月,isleap返回0表示平年,返回1表示闰年。
代码简单思想:若加上的天数add大于当月的天数,则add减去当月的天数,并使月数m加1,表示多余的日期直接换算为月数并添加上去,过程中若月数m=13,则年数y加1,m从1开始,循环直到add小于当月的天数,然后用剩下add天数与日期的天数d相加,再判断一次d是否超过当月天数的限制,最后输出ymd。
输出:年数4位“%04d”,月数2位“%02d”,天数2位“%02d”
#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=0;
int y=0,m=0,d=0;
int add=0;
scanf("%d",&n);
while(n>0)
{
scanf("%d%d%d%d",&y,&m,&d,&add);
while(add>month[m][isleap(y)])
{
add=add-month[m][isleap(y)];
m++;
if(m==13)
{
y++;
m=1;
}
}
d=d+add;
if(d>month[m][isleap(y)])
{
m++;
d=d-month[m][isleap(y)];
}
printf("%04d-%02d-%02d\n",y,m,d);
n--;
}
return 0;
}