日历算法问题
日历算法问题
日历算法?
要研究日历算法,首先要知道日历的编排规则,也就是历法。所谓历法,指的就是推算年、月、日的时间长度和它们之间的关系,指定时间序列的法则。我国的官方历法是中国公历,也就是世界通用的格里历(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) 输出星期
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义