鱼C论坛

 找回密码
 立即注册
查看: 2975|回复: 9

[已解决]Python蓝桥杯c题我这咋错了??

[复制链接]
发表于 2021-6-6 22:20:11 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 头发 于 2021-6-6 22:27 编辑


                               
登录/注册后可看大图
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月的第一天,找了好久也没发现问题所在,求解谢谢


核对了几年中的几天,每天跑的里程数正确
最佳答案
2021-7-7 01:21:00
哎,给你仔细分析一下你的代码,问题出在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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-6-6 22:25:31 | 显示全部楼层
刚才题目搞错了 不好意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-7 12:29:04 | 显示全部楼层
python的优点是各种模块,所以,能用模块解决问题就不要自己去整太多了。
import datetime
be_date=datetime.date(2000,1,1)
end_date=datetime.date(2020,10,1)
run_lenth=0
while be_date<=end_date:
    if be_date.isoweekday()==1 or be_date.day==1:
        run_lenth+=2
    else:
        run_lenth+=1
    be_date+=datetime.timedelta(1)
print(run_lenth)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-7 13:20:34 | 显示全部楼层
你的算法bug是如果1号是周六就不会计2公里,具体位置看注释
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
                                if day == 1:                 #这是周六时候执行的代码,如果不加判断,无论是不是1号都+1
                                        di_w[day] = 2
                                        n += 1
                                else:
                                        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)
# 8879

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

使用道具 举报

 楼主| 发表于 2021-6-7 13:21:34 | 显示全部楼层
txxcat 发表于 2021-6-7 12:29
python的优点是各种模块,所以,能用模块解决问题就不要自己去整太多了。

我看到这个了
但我没找出我错在哪了(错的还特巧),随便检查了下日期和走的历程对应的都正确
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-9 22:22:08 | 显示全部楼层
头发 发表于 2021-6-7 13:21
我看到这个了
但我没找出我错在哪了(错的还特巧),随便检查了下日期和走的历程对应的都正确

没看到我的第二个回复?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-2 12:42:06 | 显示全部楼层
txxcat 发表于 2021-6-7 13:20
你的算法bug是如果1号是周六就不会计2公里,具体位置看注释。

好长时间没来了谢谢大佬回答
您注释的地方 1号的时候我是加2的呀
di_w[day] = 2 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-3 00:13:11 | 显示全部楼层
头发 发表于 2021-7-2 12:42
好长时间没来了谢谢大佬回答
您注释的地方 1号的时候我是加2的呀

你加2的代码是31行,是n小于7时执行的代码,我修改的代码在38行,是n等于7时执行的代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-6 16:50:03 | 显示全部楼层
txxcat 发表于 2021-7-3 00:13
你加2的代码是31行,是n小于7时执行的代码,我修改的代码在38行,是n等于7时执行的代码。

n=7时 执行n=0
if day == 1 就是判断是否为一号的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-7 01:21:00 | 显示全部楼层    本楼为最佳答案   
哎,给你仔细分析一下你的代码,问题出在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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-14 17:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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