『题解』UVa online judge UVA13275 Leap Birthdays

题目传送门

题目大意

给定一个人的出生日期(d:m),要求求出从第 \(y\) 年到第 \(qy\) 年中这个人过了多少次生日(不包括第 \(y\) 年)。

思路

看上去好像只是减法诶,可是,有一种情况:生日在 \(2\)\(29\) 日(悲,四年一次生日)。

普通情况可以直接输出 \(qy-y\),因为不包括第 \(y\) 年,所以不用加一。

生日在 \(2\)\(29\) 日的就需要算一下了。注意年份 \(y\)\(y \bmod 4=0\)\(y \bmod 100 \ne 0\) 时或 \(y \bmod 400=0\) 时才是闰年。

\(y+1\) 开始判断哪一年是闰年,找到以后得到年份 \(ry\),将 \(qy\) 减去 \(ry\) 并加 \(1\) 即为从 \(y+1\) 年开始第一个闰年到 \(qy\) 年的年数了。将这个数除以 \(4\) 就可以得到这中间的闰年数了(向下取整)。

代码

#include <iostream>
using namespace std;
int t,d,m,y,qy,ans;

int main(){
    cin >> t;
    for(int i=1; i<=t; i++){
        cin >> d >> m >> y >> qy;
        if(m==2 && d==29){
            ans=0;
            for(int i=y+1; i<=qy; i++){
                if(i%4==0 && i%100!=0 || i%400==0){
                    ans++;
                }
            }
        }else{
            ans=qy-y;
        }
        printf("Case %d: %d\n",i,ans);
    }
    return 0;
}
posted @ 2022-04-11 16:04  仙山有茗  阅读(23)  评论(0)    收藏  举报