zoukankan      html  css  js  c++  java
  • 让你能够口算天数神级数学公式!

    如求出一个日期到另一个日期过了多少天呢?

    很显然的,我们可以使用——

    暴力模拟

    这应该是最容易想到的方法了,但问题是代码量很大:

    ·判断平闰年

    ·计算每个月天数

    ·考虑日期大小关系

    ·其他细节

    可是,只是为了求两个日期之间的日子,真的需要这么复杂的代码吗?

    我们考虑一下使用数学方法(容斥原理)如何解决此类问题

    数学方法

    求两个日期之间的相对差值会较为麻烦,因此我们考虑分别求出每个日期对一个固定时间(设为1年1月1日)的绝对差值,然后两式相减即可。

    首先,每一年的“基础天数”为 (y*365)

    接着考虑闰年对年份的影响:每四年一个闰年,每一百年少一个闰年,每四百年多扣除了一天,于是修正的天数为 (y÷4-y÷100+y÷400)

    最后,也是最麻烦的地方,我们需要判断2月在平闰年对天数的影响状况,这里列出几个式子:

    (31+30+31+30+31=153)

    (457-365=92)

    (92=31+30+31)

    (365-31-28=306)

    根据容斥原理,我们需要作出以下修正:

    ((153*m-457)/5+d-306)

    于是,最终结果长成这个样子:

    (365*y+y/4-y/100+y/400+(153*m-457)/5+d-306)

    利用上面的公式,我们就可以计算出某一个日期距离公元第一天的天数之差,分别计算后两数相减即可解决开篇提出的问题

    这里放一下代码

    long long Calculation(int y,int m,int d)
    {
    	if (m<3) {y-=1;m+=12;}
    	return  365*y+y/4-y/100+y/400+(153*m-457)/5+d-306;
    }
    

    https://home.cnblogs.com/u/tqr06/

    https://www.cnblogs.com/tqr06/p/10400144.html

  • 相关阅读:
    [LeetCode]Set Matrix Zeroes
    计算4000000000内的最大f(n)=n值---字符串的问题python实现(五岁以下儿童)
    ajax提交与上传文件同步
    清理收缩VMware虚拟机MacOS系统的vmdk文件大小
    Codeforces Round #243 (Div. 1)-A,B,C-D
    oracle substr功能
    DP 水的问题
    [LeetCode]Evaluate Reverse Polish Notation
    2014鞍山直播比赛H称号HDU5077(DFS修剪+通过计)
    Android
  • 原文地址:https://www.cnblogs.com/tqr06/p/10380574.html
Copyright © 2011-2022 走看看