基于集合关系对求解闰年数的算法优化
基于集合关系对求解闰年数的算法优化
前两天在微博上看到一个视频,好像是人民日报转发的,本来想把链接挂上来的,刚刚去翻了半天,没有找到。
视频中一位老师给学生讲为什么有闰年的存在,从而讲到什么是闰年。
我们知道,闰年有两个条件,满足任意一个即为闰年:
1、年份能被4整除但不能被400整除;
2、年份能被400整除。
通常,我求一个区间内的闰年数时,常规方法是会使用一个循环进行遍历,然后依据以上的两个条件对每一个年份进行判断,从而得出给定区间内有多少个闰年,比如0~2017,但是这里就有个问题,如果所求区间较小,还没什么影响。如果所求区间较大,比如0~2017000000,那么使用常规的循环方法就会非常耗时。
-------------------------------下面是集合的方法--------------------------
我们定义三个集合A,B,C。
其中A集合中为区间内所有的4的倍数;
B集合中为区间内所有的100的倍数;
C集合中为区间内所有的400的倍数;
那么,很显然,C包含于B,B包含于A。
这里我们假设A集合中的元素个数为a,B集合中的元素个数为b,C集合中的元素个数为c,那么:
条件1、年份能被4整除但不能被400整除
即为a-b
条件2、年份能被400整除
即为c
区间内闰年的总数即为:a-b+c
示例代码如下:
1 public class test{ 2 //常规方法 3 public static void way_1(){ 4 int count = 0; 5 int year = 2000000000; 6 for(int i = 0;i<year;i++){ 7 if(i%400==0) 8 count++; 9 else if(i%4==0 && i%100!=0) 10 count++; 11 } 12 System.out.println("way_1 count is:"+count); 13 } 14 //集合方法 15 public static void way_2(){ 16 int count = 0; 17 int year = 2000000000; 18 int A=0,B=0,C=0; 19 A = year/4; 20 B = year/100; 21 C = year/400; 22 count = A-B+C; 23 System.out.println("way_2 count is:"+count); 24 } 25 26 public static void main(String [] args){ 27 //分别注释其中一个方法,测试另一个的执行时间 28 way_1(); 29 way_2(); 30 } 31 }
当区间为0~2000000000时,常规方法的运行时间是集合方法的数十倍~

浙公网安备 33010602011771号