鱼C论坛

 找回密码
 立即注册
查看: 2564|回复: 19

[已解决]我这万年历那里错了??

[复制链接]
发表于 2022-12-28 22:31:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 jcpython2 于 2022-12-29 13:23 编辑

给定年月日,求星期几。已知2020年11月18日是星期三。

输入
第一行是n(n <=30),表示有n组数据
接下来n行,每行是一组数据。
每行三个整数y,m,d,分别代表年,月,日。(-1000000<=y<=1000000)

week = ["Sunday","Monday","Tuesday","Wednesday","Thursday", "Friday","Saturday"]
monthDays = [-1,31,28,31,30,31,30,31,31,30,31,30,31]
#初始化12个月每个月各多少天,从下标1开始,下标0无意义

days = 0
#从2020-11-18 周3开始经过多少天

lst = input().split()
year,month,date = int(lst[0]) , int(lst[1]) , int(lst[2])
#输入分配年月日

#计算相差多少整年,分别累加相差的年数 月数 日数计算出相差的days数,再%7得出星期几

for y in range(2012,year):   #累加年数
    if y%4 ==0 and y%100!=0 or y%400==0: #闰年判断
        days += 366
    else:
        days += 365
    
    
if year%4 ==0 and year%100!=0 or year%400==0: #闰年判断
    monthDays[2] = 29


for i in range(1,month):  #累加月数.input输入那年过掉的月数总天数,如果是1月则(1,1)不循环不计算
    days += monthDays[i]


days += date     #累加天数

#由于一开始是整年累加,要减去2022-11-15一共多少天
sourDay = 15
sourYear =2022
sourMonth = 11

#判定2022是否闰年
if sourYear%4 ==0 and sourYear%100!=0 or sourYear%400==0: #闰年判断
    sourDay += 1

for i in range(1,sourMonth+1):  #累加月数.input输入那年过掉的月数总天数,如果是1月则(1,1)不循环不计算
    sourDay += monthDays[i]


days -= sourDay    #由于一开始按整年计算日期,所有要扣除题目一开始给的11个月15天

print(week[days%7],days%7)



是不是 days -= sourDay    #由于一开始按整年计算日期,所有要扣除题目一开始给的11个月15天
这一步思路错了? 该怎么纠正??
最佳答案
2023-1-1 02:51:56
是公式出了问题,2020年前,是算当年剩余的天数,当年全年天数已经计算;同时,对2020,10,18前的天数是相加,所以计算公式:

  for y in range(year,2020):   #累加年数
             days += 365+int(rn(y))
         days -= mtodays(month) #当年天数
         days = days2020+days  #距离2020-11-18 周3还需要经过多少天
#coding=utf-8
week = ["Sunday","Monday","Tuesday","Wednesday","Thursday", "Friday","Saturday"]
#初始化12个月每个月各多少天,从下标1开始,下标0无意义
monthDays = [-1,31,28,31,30,31,30,31,31,30,31,30,31]
sourYear =2020
sourMonth = 11
sourDay = 18
sourweek=3
days=0
days2020=0
#判定是否闰年
def rn(year):
    if year%4 ==0 and year%100!=0 or year%400==0: #闰年判断
        return 1
    else:
        return 0
#当年的天数
def mtodays(monthd):
    j=0
    for i in range(1,monthd):  #累加月数.input输入那年过掉的月数总天数,如果是1月则(1,1)不循环不计算
            j += monthDays[i]
    if monthd > 2:
            j+= rn(year)
    j +=  date
    return j
#2020-1-1日到11-18 周3经过多少天
for i in range(1,sourMonth):  
    days2020 += monthDays[i]
days2020 += rn(sourYear) + sourDay 
#print(days2020) #323
#输入分配年月日
lst = input().split()
year,month,date = int(lst[0]) , int(lst[1]) , int(lst[2])
if year == 2020:
      days = mtodays(month)- days2020
elif year > 2020:
        for y in range(2020,year):   #累加年数
            days += 365+rn(y)
        days += mtodays(month) #当年天数
        days =  days-days2020  #距离2020-11-18 周3经过多少天
else :
         for y in range(year,2020):   #累加年数
             days += 365+int(rn(y))
         days -= mtodays(month) #当年天数
         days = days2020+days  #距离2020-11-18 周3还需要经过多少天
wk=days%7 #先算7天的余数
wk=wk+sourweek #把周3加入再算
print(days,"days")

print(week[wk%7],wk%7)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-12-29 06:24:21 | 显示全部楼层
;来看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-29 10:37:42 | 显示全部楼层
最好也把题目放出来看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-29 10:42:54 | 显示全部楼层
去问砂岩猫咪(保命
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-29 13:24:00 | 显示全部楼层
isdkz 发表于 2022-12-29 10:37
最好也把题目放出来看看

题目已经更新,但我只是写核心功能

就是给定日期求星期几 ,已知2020年11月18日是星期三。
输入 2022 12 29 输出4这样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-29 13:59:08 | 显示全部楼层
jcpython2 发表于 2022-12-29 13:24
题目已经更新,但我只是写核心功能

就是给定日期求星期几 ,已知2020年11月18日是星期三。

所以你的代码中为什么是从 2012 年开始算,

2022-11-15又是什么日期?题目里面没有出现
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-29 17:59:24 | 显示全部楼层
isdkz 发表于 2022-12-29 13:59
所以你的代码中为什么是从 2012 年开始算,

2022-11-15又是什么日期?题目里面没有出现

思路是18号是星期三,我的星期列表是星期日为0,所以18-3=15 先算星期天,感觉这样比较方便,最后再补回天数去
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-29 19:22:29 | 显示全部楼层
本帖最后由 chinajz 于 2022-12-29 19:33 编辑

这个题目以前做的,只要定下某天,前后推都没问题。设定年份最好非润年,然后推算某年的元月1日作为基数,其它日期累计推算
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-29 21:25:15 | 显示全部楼层
chinajz 发表于 2022-12-29 19:22
这个题目以前做的,只要定下某天,前后推都没问题。设定年份最好非润年,然后推算某年的元月1日作为基数, ...

是的
具体方向就是这样的,参考代码用的是1月份起步,我用11月就出错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-29 22:20:22 | 显示全部楼层
days += date     #累加天数,这个。。。
sourDay = 15 等原始变量不要再用++ ,可以换个变量统计
代码看起来感觉有些乱
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-29 22:32:27 | 显示全部楼层
2020 2012 注释里有2022,建议根据条件推算出
sourYear =2012
sourMonth =1
sourDay = 1
的week=1,以此向后按天数求余数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-29 22:38:18 | 显示全部楼层
如果用2012、11月、18日,为基准,要向前、向后推,推到公元前的,再推到万年后。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-30 20:42:17 | 显示全部楼层
本帖最后由 chinajz 于 2022-12-30 22:10 编辑
#coding=utf-8
week = ["Sunday","Monday","Tuesday","Wednesday","Thursday", "Friday","Saturday"]
#初始化12个月每个月各多少天,从下标1开始,下标0无意义
monthDays = [-1,31,28,31,30,31,30,31,31,30,31,30,31]
sourYear =2020
sourMonth = 11
sourDay = 18
sourweek=3
days=0
days2020=0
#判定是否闰年
def rn(year):
    if year%4 ==0 and year%100!=0 or year%400==0: #闰年判断
        return 1
    else:
        return 0
#当年的天数
def mtodays(monthd):
    j=0
    for i in range(1,monthd):  #累加月数.input输入那年过掉的月数总天数,如果是1月则(1,1)不循环不计算
            j += monthDays[i]
    if monthd > 2:
            j+= rn(year)
    j +=  date
    return j
#2020-1-1日到11-18 周3经过多少天
for i in range(1,sourMonth):  
    days2020 += monthDays[i]
days2020 += rn(sourYear) + sourDay 
#print(days2020) #323
#输入分配年月日
lst = input().split()
year,month,date = int(lst[0]) , int(lst[1]) , int(lst[2])
if year == 2020:
      days = mtodays(month)- days2020
elif year > 2020:
        for y in range(2020,year):   #累加年数
            days += 365+rn(y)
        days += mtodays(month) #当年天数
        days =  days-days2020  #距离2020-11-18 周3经过多少天
else :
         for y in range(year,2020):   #累加年数
             days += 365+int(rn(y))
         days += mtodays(month) #当年天数
         days = days2020-days  #距离2020-11-18 周3还需要经过多少天
wk=days%7 #先算7天的余数
wk=wk+sourweek #把周3加入再算
wk=abs(wk)
print(days,"days")
print(week[wk%7],wk%7)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-30 20:56:40 | 显示全部楼层
哈哈,草写的,你可以优化一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-30 21:57:29 | 显示全部楼层

我下班回家看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-31 18:04:43 | 显示全部楼层

校验失败
校验数据 2017 10 18

正确 周3 你的程序是Thursday
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-31 20:41:26 | 显示全部楼层
已经知道错误出现在计算闰年这一步

2020前和2020后计算闰年时间计算方式不一样

虽然知道错,但还是不会改,数学不好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-1 02:51:56 | 显示全部楼层    本楼为最佳答案   
是公式出了问题,2020年前,是算当年剩余的天数,当年全年天数已经计算;同时,对2020,10,18前的天数是相加,所以计算公式:

  for y in range(year,2020):   #累加年数
             days += 365+int(rn(y))
         days -= mtodays(month) #当年天数
         days = days2020+days  #距离2020-11-18 周3还需要经过多少天
#coding=utf-8
week = ["Sunday","Monday","Tuesday","Wednesday","Thursday", "Friday","Saturday"]
#初始化12个月每个月各多少天,从下标1开始,下标0无意义
monthDays = [-1,31,28,31,30,31,30,31,31,30,31,30,31]
sourYear =2020
sourMonth = 11
sourDay = 18
sourweek=3
days=0
days2020=0
#判定是否闰年
def rn(year):
    if year%4 ==0 and year%100!=0 or year%400==0: #闰年判断
        return 1
    else:
        return 0
#当年的天数
def mtodays(monthd):
    j=0
    for i in range(1,monthd):  #累加月数.input输入那年过掉的月数总天数,如果是1月则(1,1)不循环不计算
            j += monthDays[i]
    if monthd > 2:
            j+= rn(year)
    j +=  date
    return j
#2020-1-1日到11-18 周3经过多少天
for i in range(1,sourMonth):  
    days2020 += monthDays[i]
days2020 += rn(sourYear) + sourDay 
#print(days2020) #323
#输入分配年月日
lst = input().split()
year,month,date = int(lst[0]) , int(lst[1]) , int(lst[2])
if year == 2020:
      days = mtodays(month)- days2020
elif year > 2020:
        for y in range(2020,year):   #累加年数
            days += 365+rn(y)
        days += mtodays(month) #当年天数
        days =  days-days2020  #距离2020-11-18 周3经过多少天
else :
         for y in range(year,2020):   #累加年数
             days += 365+int(rn(y))
         days -= mtodays(month) #当年天数
         days = days2020+days  #距离2020-11-18 周3还需要经过多少天
wk=days%7 #先算7天的余数
wk=wk+sourweek #把周3加入再算
print(days,"days")

print(week[wk%7],wk%7)

评分

参与人数 1鱼币 +1 收起 理由
jcpython2 + 1 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-1 03:06:33 | 显示全部楼层
如果2020年前负数一致,可以写成  
for y in range(year,2020):   #累加年数
             days += 365+int(rn(y))
         days += days2020 #2020当年天数
         days = mtodays(month)-days  #距离2020-11-18 周3还需要经过多少天
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-2 01:47:44 | 显示全部楼层
chinajz 发表于 2023-1-1 02:51
是公式出了问题,2020年前,是算当年剩余的天数,当年全年天数已经计算;同时,对2020,10,18前的天数是相 ...

感谢老哥的详细解答,我在你第一个答案当晚推翻重新来写,终于发现错处并且更正过来

逻辑跟你这个是一样的,就是在索引时间前要+ 索引时间后要-

做的时候一直迷糊,难怪校验数据一些正确一些错误,我自己也是忘记了最基础的运算规则

再次感谢老哥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-25 03:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表