日历算法问题

日历算法问题

日历算法?

要研究日历算法,首先要知道日历的编排规则,也就是历法。所谓历法,指的就是推算年、月、日的时间长度和它们之间的关系,指定时间序列的法则。我国的官方历法是中国公历,也就是世界通用的格里历(Gregorian Calendar),中国公历的年分为平常年和闰年,(重点)平常年一年是365天闰年一年是366天

(重点)判定一年是平常年还是闰年的规则如下:

(1)如果年份是 4 的倍数且不是 100 的倍数,则是闰年

(2)如果年份是 400 的倍数,则是闰年

(3)不满足 1、2 条件的就是平常年。

(重点)中国公历关于月的规则如下:

(1)一月三月五月七月八月十月十二月是大月,一个月有 31 天

(2)四月六月九月十一月是小月,一个月有 30 天

(3)二月的天数要根据是否是闰年来定,如果是闰年二月是 29 天如果是平常年二月是 28 天

(重点)关于计算星期如下:

(1)先要有一个时间来进行对比,这个时间要知道准确星期数。

(2)在依次与7进行求余(%),根据余数得出星期数

例如:2022年3月24日为星期四,则25号为星期五,26号为星期六,27号为星期天,28号为星期一,29号为星期二,30号为星期三,31号为星期四

即可以得出:(25-24)%7=1......表示为星期五

      (26-24)%7=2......表示为星期六

      (27-24)%7=3......表示为星期天

      (28-24)%7=4......表示为星期一

      (29-24)%7=5......表示为星期二

      (30-24)%7=6......表示为星期三

      (31-24)%7=0......表示为星期四

星期的求解根据题目进行上述步骤既可以确定某一天是星期几

例题?

描述:

   在我们现在使用的日历中, 闰年被定义为能被 4 整除的年份,但是能被 100 整除而不能被 400 整除的年是例外,它们不是闰年。例如:1700, 1800, 1900 和 2100 不是闰年,而 1600, 2000 和 2400 是闰年。 给定从公元 2000 年 1 月 1 日开始逝去的天数,你的任务是给出这一天是哪年哪月哪日星期几。

 输入:

    输入包含若干行,每行包含一个正整数,表示从 2000 年 1 月 1 日开始逝去的天数;输入最后一行是−1, 不必处理。可以假设结果的年份不会超过 9999.

样例输入:

     1730

     1740

     1750

     1751

      -1

样例输出:

      2004-09-26  Sunday

      2004-10-06  Wednesday

      2004-10-16  Saturday

      2004-10-17  Sunday

 

复制代码
def quedingrunnian(i): #用来求解是否为闰年
    if (i%4==0 and i%100!=0) or i%400==0:
        return 1
    else:
        return 0

def quedingnian(i,j): #用来求解为第几年
    while j>365: #当j小于365,则说明已经构不成下一年了
        num1=quedingrunnian(i) #判断该年是否是闰年
        if num1==1: #若该年是闰年,则减去366天,增加一年
            j=j-366
            i+=1
        else:
            j=j-365 #若该年不是闰年,减去365天,增加一年
            i+=1
    return i #返回出最后的年份i
def quedingyueri(i,j): #用来算出天数所能增加到的最大年份,而所剩下的天数 while j>365: num1=quedingrunnian(i) #跟上述的解释类似,只不过这里求的是剩余的天数 if num1==1: j=j-366 i+=1 else: j=j-365 i+=1 return j #返回出增大到最大年份,而所剩下的天数 def panduanxingqi(j): #用来求解该天为星期几 xingqi={1:'Sun',2:'Mon',3:'Tue',4:'Wed',5:'Thu',6:'Fri',0:'Sat'} num=j%7 print(xingqi[num])
i
=2000 #题目中规定的以2000年开始 b=[] #用来装输入的天数 a=int(input()) while a!=-1: b.append(a) a=int(input()) yue1={1:31,2:29,3:31,4:30,5:31,6:30,7:31,8:31,9:30,10:31,11:30,12:31} #用来表示闰年中每一个月的天数 yue2={1:31,2:28,3:31,4:30,5:31,6:30,7:31,8:31,9:30,10:31,11:30,12:31} #用来表示不是闰年中每一个月的天数 for j in b: #用来依次的算出每个天数所能表示年份-月-日 星期数 num1=quedingnian(i,j) #用来表示所能增加到的最大的年份 num3=num2=quedingyueri(i,j) #用来表示剩余的天数 k=1 #用来记录这些这些天数所能表示到的最大月份 if quedingrunnian(num1)==1: #若为闰年,则每次增加一个月份所需要减去的天数 while num2-yue1[k]>=0: num2=num2-yue1[k] k+=1 ri=num2 #表示为日 else: while num2-yue2[k]>=0: #下面的与上述的类似 num2=num2-yue2[k] k+=1 ri=num2 if k<10: #按照题目输出要求进行输出 if ri<10: print(str(num1)+'-'+'0'+str(k)+'-'+'0'+str(ri+1),end=' ') else: print(str(num1)+'-'+'0'+str(k)+'-'+str(ri+1),end=' ') else: if ri<10: print(str(num1)+'-'+str(k)+'-'+'0'+str(ri+1),end=' ') else: print(str(num1)+'-'+str(k)+'-'+str(ri+1),end=' ') panduanxingqi(j) 输出星期
复制代码

 

posted @   天空之城—我的理想国  阅读(369)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示