题目描述
2014年2月27日,第十二届全国人大常委会第七次会议通过决定,将每年的12月13日设立为南京大屠杀死难者国家公祭日。现在请你编写程序,对于输入的日期,计算这个日期与最近的南京大屠杀死难者国家公祭日间隔几天。
样例
输入描述:
第一行为一个整数 t ,代表共有t组数据,接下来 t 行每行有三个正整数Y,M,D,依次代表输入日期的年月日
输出描述:
对于每组测试数据都有一行输出,每行各有一个整数,为计算得到的天数。
示例1
输入
3
2020 12 1
1926 8 17
2017 2 9
输出
12
118
58
C++ 代码 日期模拟题
#include<iostream>
using namespace std;
int month[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int n;
auto main() -> int
{
cin >> n;
int res1 = 0, res2 = 0; //这里使用 res1 表示的是从当前日期往后偏移到达今年 12.13 的偏移量, 若这个月为12月就为距离13号的偏移量(包括了向前偏移和向后偏移两种情况), res2 表示从当前日期向前偏移到达去年12.13的偏移量
while(n--)
{
int y,m,d;
cin >> y >> m >> d;
for(int i = m; i <= 11 ; ++i) // 计算从当前日期的 m月d号 到达 12月d号 的res1 偏移量为多少
{
res1 += month[i];
if(i == 2 && (y % 100 && y % 4 == 0 || y % 400 == 0)) res1++; // 若此时的月份为二月份, 判断是否平年或者闰年, 若为闰年需要从二月x号到达3月x号,需要 + 29
}
if(d <= 13) res1 += 13 - d; // 若此时的 d > 13 , 说明偏移量超了, 需要减去部分偏移量, 若 d <= 13 , 则要加上部分偏移量
else res1 -= d - 13;
if(res1 < 0) res1 = abs(res1); // 这个特判是因为 如果输入的日期为 12.13 之后, 12.31之前, 这段时期的偏于量是负数, 故这里直接取绝对值, 这里纯粹是写法的问题,本来res1应该就是先后的,但这里直接用一个res1, res2 只作为向前偏移到前年的 !!! 就是缺少这个特判导致一直AC不过
for(int i = m; i > 1; i--) // res2 向前偏移, 从当前月份先偏移到 1 月份
{
res2 += month[i-1];
if(i == 3 && (y % 100 && y % 4 == 0 || y % 400 == 0)) res2++;
}
res2 += month[12]; // 然后先前偏移到 12 月份, 由于是不管啥情况都是直接偏移到前年的12月份的13号, 故在写法上不可能出现负数的情况,故这里并不需要特判。
if(d <= 13) res2 -= 13 - d; // 同样对 d 和 13 的关系进行判断。
else res2 += d - 13;
cout << min(res1, res2) << endl; // 输出 res1 和 res2 的 较小值
res1 = 0, res2 = 0;
}
}
代码思路
这里的思路采用的是y总每日一题: 1341. 十三号星期五
采用打表的方式, 然后逐月份进行偏移量的计算。 这里的话要注意一下出现特判的情况 !!!