HH的生日是YY年MM月DD日,他想知道自己出生后第一万天纪念日的日期(出生日算第0天)。
标签:hpu1247
HH的生日是YY年MM月DD日,他想知道自己出生后第一万天纪念日的日期(出生日算第0天)。
输入有多行
第一行先输入一个数字N
接下来第2行到第N+1行,每行输入一个时间,格式为YY MM DD 其中1949<=YY<=2006,日期绝对合法。
输出有多行。即HH生日第一万天以后的日期,格式为 “Y-M-D”。
每组测试数据占一行输出!
测试代码的正误,是根据后台多组测试数据来判断的,并非题目给出的测试数据没问题就能AC
#include <stdio.h>
#include <string.h>
bool f(int y) {
return y % 4 == 0 && y % 100 != 0 || y % 400 == 0;
}
int cal(int y, int m, int d) {
--m;
switch(m) {
case 11: d += 30;
case 10: d += 31;
case 9: d += 30;
case 8: d += 31;
case 7: d += 31;
case 6: d += 30;
case 5: d += 31;
case 4: d += 30;
case 3: d += 31;
case 2: d += 28;
if(f(y)) ++d;
case 1: d += 31;
}
return d;
}
int main() {
int y, m, d, T, sum, tmp, i;
scanf("%d", &T);
while (T--) {
scanf("%d%d%d", &y, &m, &d);
tmp = 10000;
tmp -= 365 - cal(y, m, d);
if (f(y)) --tmp;
while (tmp > 365) {
++y;
tmp -= 365;
if (f(y)) --tmp;
}
++y;
for (i = 1; i <= 12 && tmp > 31; ++i) {
if (i == 1 || i == 3 ||i == 5 ||i == 7 ||i == 8 ||i == 10 ||i == 12)
tmp -= 31;
else if (i == 2) {
tmp -= 28;
if(f(y)) --tmp;
}
else tmp -= 30;
}
if (i == 2 && tmp > 28) {
if(f(y) && tmp > 29) i = 3, tmp -= 29;
else if(!f(y) && tmp > 28) i = 3, tmp -= 28;
} else if (tmp == 31) {
if (!(i == 1 || i == 3 ||i == 5 ||i == 7 ||i == 8 ||i == 10 || i == 12))
++i, tmp = 1;
}
printf("%d-%d-%d\n", y, i, tmp);
}
return 0;
}
/**************************************************************
Problem: 1247
User: changmu
Language: C++
Result: Accepted
Time:0 ms
Memory:816 kb
****************************************************************/
标签:hpu1247
原文地址:http://blog.csdn.net/chang_mu/article/details/42065321