我这万年历那里错了??
本帖最后由 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) , int(lst) , int(lst)
#输入分配年月日
#计算相差多少整年,分别累加相差的年数 月数 日数计算出相差的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 = 29
for i in range(1,month):#累加月数.input输入那年过掉的月数总天数,如果是1月则(1,1)不循环不计算
days += monthDays
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
days -= sourDay #由于一开始按整年计算日期,所有要扣除题目一开始给的11个月15天
print(week,days%7)
是不是 days -= sourDay #由于一开始按整年计算日期,所有要扣除题目一开始给的11个月15天
这一步思路错了? 该怎么纠正??
;来看看 最好也把题目放出来看看 去问砂岩猫咪(保命 isdkz 发表于 2022-12-29 10:37
最好也把题目放出来看看
题目已经更新,但我只是写核心功能
就是给定日期求星期几 ,已知2020年11月18日是星期三。
输入 2022 12 29 输出4这样 jcpython2 发表于 2022-12-29 13:24
题目已经更新,但我只是写核心功能
就是给定日期求星期几 ,已知2020年11月18日是星期三。
所以你的代码中为什么是从 2012 年开始算,
2022-11-15又是什么日期?题目里面没有出现 isdkz 发表于 2022-12-29 13:59
所以你的代码中为什么是从 2012 年开始算,
2022-11-15又是什么日期?题目里面没有出现
思路是18号是星期三,我的星期列表是星期日为0,所以18-3=15 先算星期天,感觉这样比较方便,最后再补回天数去 本帖最后由 chinajz 于 2022-12-29 19:33 编辑
这个题目以前做的,只要定下某天,前后推都没问题。设定年份最好非润年,然后推算某年的元月1日作为基数,其它日期累计推算 chinajz 发表于 2022-12-29 19:22
这个题目以前做的,只要定下某天,前后推都没问题。设定年份最好非润年,然后推算某年的元月1日作为基数, ...
是的
具体方向就是这样的,参考代码用的是1月份起步,我用11月就出错 days += date #累加天数,这个。。。
sourDay = 15 等原始变量不要再用++ ,可以换个变量统计
代码看起来感觉有些乱 2020 2012 注释里有2022,建议根据条件推算出
sourYear =2012
sourMonth =1
sourDay = 1
的week=1,以此向后按天数求余数 如果用2012、11月、18日,为基准,要向前、向后推,推到公元前的,再推到万年后。 本帖最后由 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
if monthd > 2:
j+= rn(year)
j +=date
return j
#2020-1-1日到11-18 周3经过多少天
for i in range(1,sourMonth):
days2020 += monthDays
days2020 += rn(sourYear) + sourDay
#print(days2020) #323
#输入分配年月日
lst = input().split()
year,month,date = int(lst) , int(lst) , int(lst)
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) 哈哈,草写的,你可以优化一下 chinajz 发表于 2022-12-30 20:42
我下班回家看看 chinajz 发表于 2022-12-30 20:42
校验失败
校验数据 2017 10 18
正确 周3 你的程序是Thursday 已经知道错误出现在计算闰年这一步
2020前和2020后计算闰年时间计算方式不一样
虽然知道错,但还是不会改,数学不好{:10_269:}{:10_269:}{:10_269:}{:10_269:}{:10_269:} 是公式出了问题,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
if monthd > 2:
j+= rn(year)
j +=date
return j
#2020-1-1日到11-18 周3经过多少天
for i in range(1,sourMonth):
days2020 += monthDays
days2020 += rn(sourYear) + sourDay
#print(days2020) #323
#输入分配年月日
lst = input().split()
year,month,date = int(lst) , int(lst) , int(lst)
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)
如果2020年前负数一致,可以写成
for y in range(year,2020): #累加年数
days += 365+int(rn(y))
days += days2020 #2020当年天数
days = mtodays(month)-days#距离2020-11-18 周3还需要经过多少天 chinajz 发表于 2023-1-1 02:51
是公式出了问题,2020年前,是算当年剩余的天数,当年全年天数已经计算;同时,对2020,10,18前的天数是相 ...
感谢老哥的详细解答,我在你第一个答案当晚推翻重新来写,终于发现错处并且更正过来
逻辑跟你这个是一样的,就是在索引时间前要+ 索引时间后要-
做的时候一直迷糊,难怪校验数据一些正确一些错误,我自己也是忘记了最基础的运算规则
再次感谢老哥
页:
[1]