求两个年份之间闰年的数目

最开始碰到的是这个问题,求给定的两个数之间能同时被2,3,5整除的数,可以发现如果一个数能同时被2,3,5整除,那么它肯定可以被30整除。我们可以编写一个函数判断一个数是否可以被30整除,然后遍历给定的两个数中的区间逐个地判断就可以了。

//解法一
bool isNums(int num)
{
	if(num%30==0)
			return true;
	return false;
}

int calculateNums2(int begin,int end)
{
	int count=0;
	for(int i=begin;i<=end;i++)
	{
		if(isNums(i))
				count++;
	}

	return count;
}

但是这种方法时间复杂度太高了。

有种很巧妙的办法,就是直接求出[0,begin-1]中能被30整除的数的个数;

然后求出[0,end]中能被30整除的数的个数;

两个相减就是[begin,end]之间能被30整除的数的个数了。

//解法二
int calculateNums1(int begin,int end)
{
	int left=(begin-1)/30;
	int right=end/30;
	int result=right-left;
	return result;
}

这是常数时间的求解方法。

求闰年的次数也可以用这种方法求解。

  1. 能被4整除,但不能被100整除
  2. 能被400整除

那么对于[0,begin-1]中闰年的数目可以这么求解:

(begin-1)/4-(begin-1)/100+(begin-1)/400,即[0,begin-1]中4的倍数的个数减去100的倍数的个数,再加上400的倍数的个数。这点需要好好思考一下。这样就可以在常数时间内求解了。

#include <iostream>

using namespace std;

int leapYears(int begin,int end)
{
	int begin4=(begin-1)/4;
	int begin100=(begin-1)/100;
	int begin400=(begin-1)/400;
	int left=begin4-begin100+begin400;

	int end4=end/4;
   	int end100=end/100;
	int end400=end/400;
	int right=end4-end100+end400;

	int result=right-left;
	return result;
}

int main()
{
	cout<<leapYears(1950,2050)<<endl;

	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-19 03:03:34

求两个年份之间闰年的数目的相关文章

求两个日期之间间隔的天数,Python实现

代码如下 1 def leap_year(y): #判断是否是闰年 2 if (y % 4 == 0 and y % 100 != 0) or y % 400 == 0: 3 return True 4 else: 5 return False 6 7 def days_in_month(y, m): #判断每个月都有几天 8 if m in [1, 3, 5, 7, 8, 10, 12]: 9 return 31 10 elif m in [4, 6, 9, 11]: 11 return 30

js 求两个日期之间相差天数

//求两个日期之间的相差天数 function daysBetween(DateOne, DateTwo) { var OneMonth = DateOne.substring(5, DateOne.lastIndexOf('/')); var OneDay = DateOne.substring(DateOne.length, DateOne.lastIndexOf('/') + 1); var OneYear = DateOne.substring(0, DateOne.indexOf('/

Frogger POJ - 2253(求两个石头之间”所有通路中最长边中“的最小边)

题意 ? 题目主要说的是,有两只青蛙,在两个石头上,他们之间也有一些石头,一只青蛙要想到达另一只青蛙所在地方,必须跳在石头上.题目中给出了两只青蛙的初始位置,以及剩余石头的位置,问一只青蛙到达另一只青蛙所在地的所有路径中的"the frog distance"中的最小值. ? 解释一下"the frog distance": 题目中给出了一段解释"The frog distance (humans also call it minimax distance

8.03 确定两个日期之间的工作日数目

问题:给定两个日期,求它们之间(包括这两个日期本身)有多少个"工作"日.select sum(case             when date_format(             date_add(jones_hd,interval t500.id - 1, 'DY'),'%a')             in ('SAT', 'SUN')              then 0 else 1           end) as days  from (select max(c

8.3 确定两个日期之间的工作日数目

问题:给定两个日期,求它们之间(包括这两个日期本身)有多少个"工作"日.select sum(case             when date_format(             date_add(jones_hd,interval t500.id - 1, 'DY'),'%a')             in ('SAT', 'SUN')              then 0 else 1           end) as days  from (select max(c

c++求两个日期之间的间隔天数

#include <iostream> using namespace std; static const unsigned char MonthTable[12] = {    31,28,31,30,31,30,31,31,30,31,30,31}; class Date{public:    Date(int year, int month, int day);    Date operator -(const Date& date);    //获取时间差    int get

求字符串中某两个字符之间的字符

这个简单,留作纪念,学习之初写的: 求两个A之间的字符,并打印出来: 1 #include<iostream> 2 using namespace std; 3 4 int main() 5 { 6 7 const char Stra[40] = "sdfjAI Love You So Much !Ajidhj";//呵呵,乱输的 8 const char *p; 9 p = Stra; 10 11 while (*p != '\0') 12 { 13 if (*p ==

计算两个日期之间的天数差C++/java

1--Java 分析:调用java中Calendar类 int days(Date date1,Date date2){ Calendar cal = new Calendar.getInstance(); cal.setTime(date1); int time1 = cal.get(Calendar.DAY_OF_YEAR); cal.setTime(date2); int time2 = cal.get(Calendar.DAY_OF_YEAR); //long days = Math.a

计算两个日期之间相差多少个小时

题目描述: 给定两个日期,例如2009120311和2008110413,格式为年/月/日/小时,求两个日期之间相差多少个小时. 思考: 第一感似乎应该先计算相差多少年,然后多少个月,多少天,多少个小时,然后累加就好了,但是似乎没有这么简单: 1.闰年和平年 2.每个月的天数不一样 3.闰年二月和平年二月 4.相减不够怎么办 上面的这些问题都是应该想到的,如果想到这些问题,那么应该就可以写代码了. 首先写个判断闰年还是平年的函数: def dayOfYear(year): if (year%4=