基于集合关系对求解闰年数的算法优化

基于集合关系对求解闰年数的算法优化

前两天在微博上看到一个视频,好像是人民日报转发的,本来想把链接挂上来的,刚刚去翻了半天,没有找到。

视频中一位老师给学生讲为什么有闰年的存在,从而讲到什么是闰年。

我们知道,闰年有两个条件,满足任意一个即为闰年:

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

示例代码如下:

[java]  view plain  copy
  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时,常规方法的运行时间是集合方法的数十倍~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值