|  | 
 
| 
本帖最后由 头发 于 2021-6-6 22:27 编辑
x
马上注册,结交更多好友,享用更多功能^_^您需要 登录 才可以下载或查看,没有账号?立即注册  
 
 
 复制代码
li_run = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
li_ping = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
# 每年多少天
di_n = {}
for i in range(2000,2021):
        if i % 4 == 0 and i % 100 != 0:
                di_n[i] = li_run
        elif i % 400 == 0:
                di_n[i] = li_run
        else:
                di_n[i] = li_ping
di_n[2020] = di_n[2020][:9]
# 2000.1.1周6
week = [1,1,2,1,1,1,1]
# 存每天跑多少km
di_w = {}
km = 0
year = 2000
n = 0
while year != 2021:
        for m_day in di_n[year]:
                for day in range(1,m_day+1):
                        if n < 7:
                                if day == 1:
                                        di_w[day] = 2
                                        n += 1
                                else:
                                        di_w[day] = week[n]
                                        n += 1
                        else:
                                n = 0
                                di_w[day] = week[n]
                                n += 1
                km += sum(di_w.values())
                if year == 2020:
                        print(di_w)
                        print(km)
                di_w.clear()
        year += 1
print(km+2)
# 8843
 
 我用字典给每一天都标了跑多少,然后每月求和加到km上。
 最后少的数还特别巧,8843 与网上的8879差一个 10月1号(不含)往后的里程数+上11月的第一天,找了好久也没发现问题所在,求解谢谢
 
 核对了几年中的几天,每天跑的里程数正确
 
哎,给你仔细分析一下你的代码,问题出在for day in range(1,m_day+1):循环体内: 复制代码#分析一下当n大余7的时候运行情况
if n < 7:                    #当n大余7的时候,运行else部分
        if day == 1:
                di_w[day] = 2
                n += 1
        else:
                di_w[day] = week[n]
                n += 1
else:
        n = 0                #将n重置为0,也就是week中第一位,是周六
        di_w[day] = week[n]  #当天的步数是week[0],也就是1步,无论当天是否是1号
        n += 1               #n加1,也就是0+1=1后进入下一循环,因此在第一轮循环以后,n不会再有值为0进入循环体的时候了,所有的周六都会在else中赋值为1,无论是否是1号
    所以,除了第一次循环中的周六数据会判断是否是1号,而之后所有的周六都是走else部分,无论是否是1号,都是只赋值为1,所以先前在你的代码基础上直接修改,在else里面加入判断是否是1号的部分,你运行一下修改后的代码看看结果是否正确。 
    不过这样修改,重复代码太多,可以优化一下:
 复制代码if day == 1:              #首先判断判断是否是1号,是的话直接赋值2
        di_w[day] = 2
else:
        di_w[day] = week[n]     #不是1号就根据星期几来赋值
n += 1               
if n == 7:                 #n值等于7了就复位为0,下一轮会依旧判断是否是1号
    n = 0
 | 
 |