『题解』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;
}

浙公网安备 33010602011771号