【问题描述】
闰年是公历中的名词。
普通年(不能被100整除的年份)能被4整除的为闰年。(如2004年就是闰年,1999年不是闰年);
世纪年(能被100整除的年份)能被400整除的是闰年。(如2000年是闰年,1900年不是闰年);
闰年(Leap Year)是为了弥补因人为历法规定造成的年度天数与地球实际公转周期的时间差而设立的。
计算两个年份之间有多少闰年。比如2000年到2004年之间有2个闰年。而2000年到2300年之间有73个闰年。
【输入形式】
输入第一行正整数t (10 ≤ n ≤ 100),表示有多少组测试数据。
后面有t行,每行两个正整数a,b,计算a,b两个年份之间有多少闰年。
40%的测试数据1 ≤ a≤ b≤ 10(4);
30%的测试数据1 ≤ a≤ b≤ 10(6);
20%的测试数据1 ≤ a≤ b≤ 10(7);
10%的测试数据1 ≤ a≤ b≤ 10(8);
【输出形式】
对于每组测试数据,输出一行,包含一个整数,表示a,b之间(包含a,b这两年)有多少闰年。
【样例输入】
2
2000 2004
2000 2300
【样例输出】
2
73
【样例说明】
第一个样例2000年和2004年是闰年
解题思路
定义一个函数来计算两个给定年份之间(包括这两个年份)的闰年数量。
这个函数的关键在于理解并应用闰年的规则,即:
-
普通年份能被4整除的是闰年(除非该年份也能被100整除,这种情况下它不是闰年)。
-
世纪年份(即能被100整除的年份)能被400整除的是闰年。
我们可以通过计算每个给定区间内符合上述条件的年份数量来确定闰年的总数。这可以通过计算区间内能被4、100和400整除的年份数量,然后进行适当的调整来实现。
注意:是a-1~b之间的年份
Java代码
java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int t = scanner.nextInt();// 读取测试数据组数
while(t-- > 0){
int a = scanner.nextInt();
int b = scanner.nextInt();
System.out.println(countLeapYears(a,b));
}
}
private static int countLeapYears(int a, int b) {
// 计算从1年到b年的闰年数目,然后减去从1年到a-1年的闰年数目
return leapYearsUntil(b) - leapYearsUntil(a - 1);
}
private static int leapYearsUntil(int year) {
// 能被4整除的年份
int by4 = year / 4;
// 能被100整除的年份
int by100 = year / 100;
// 能被400整除的年份
int by400 = year / 400;
// 闰年的总数 = 能被4整除 - 能被100整除 + 能被400整除的年份
return by4 - by100 + by400;
}
}