Codeforces Round #183 (Div. 2) B Calendar

Translate

给你两个日期,让你求两个日期之间差多少天,注意闰年

思路

入门的一道题,是一种题形, N O I P 普及组回文日期也是这种体型

很容易注意到

  • 闰年的 2 月是 29
  • 第一个日期和第二个日期大小不一定

针对日期大小不一定,要写代码特别判断

主要思路:
读入之后,可以从起始年算到结束年,其中月份是 1 12 月枚举,然后枚举对应天数,计数器每次 + +
可是因为月和日是不确定的,所以判断如果枚举的时间在开始时间~结束时间内,那么计数器就 + +

Code(超级压行)

#include<bits/stdc++.h>
int main(){
    int ans = 0, flag = 0, y1, m1, d1, y2, m2, d2, md[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    char ch;
    std::cin >> y1 >> ch >> m1 >> ch >> d1 >> y2 >> ch >> m2 >> ch >> d2;
    if (y1 > y2 || y1 == y2 && m1 > m2 || y1 == y2 && m1 == m2 && d1 > d2)
        std::swap(y1, y2) , std::swap(m1, m2) , std::swap(d1, d2);//交换,以上有多种情况
    for (int i = y1; i <= y2; i++){
        if (i % 100 != 0 && i % 4 == 0 || i % 400 == 0) md[2] = 29;//如果是闰年,那么临时把md[2]改成29
        for (int j = 1; j <= 12; j++)
            for (int d = 1; d <= md[j]; d++){
                if (i == y1 && j == m1 && d == d1) flag = 1;
                if (i == y2 && j == m2 && d == d2) flag = 0;//找到符合要求的部分,注意一下细节问题
                if (flag) ans++;
            }
        md[2] = 28;//别忘恢复
    }
    std::cout<<ans<<std::endl;//输出答案
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39984146/article/details/81840718