鱼C论坛

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

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

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

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

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

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


                               
登录/注册后可看大图



  1. li_run = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
  2. li_ping = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

  3. # 每年多少天
  4. di_n = {}
  5. for i in range(2000,2021):
  6.         if i % 4 == 0 and i % 100 != 0:
  7.                 di_n[i] = li_run
  8.         elif i % 400 == 0:
  9.                 di_n[i] = li_run
  10.         else:
  11.                 di_n[i] = li_ping
  12. di_n[2020] = di_n[2020][:9]

  13. # 2000.1.1周6
  14. week = [1,1,2,1,1,1,1]
  15. # 存每天跑多少km
  16. di_w = {}

  17. km = 0
  18. year = 2000
  19. n = 0
  20. while year != 2021:
  21.         for m_day in di_n[year]:

  22.                 for day in range(1,m_day+1):
  23.                         if n < 7:
  24.                                 if day == 1:
  25.                                         di_w[day] = 2
  26.                                         n += 1
  27.                                 else:
  28.                                         di_w[day] = week[n]
  29.                                         n += 1
  30.                         else:
  31.                                 n = 0
  32.                                 di_w[day] = week[n]
  33.                                 n += 1
  34.                 km += sum(di_w.values())
  35.                 if year == 2020:
  36.                         print(di_w)
  37.                         print(km)
  38.                 di_w.clear()
  39.         year += 1
  40. print(km+2)
  41. # 8843
复制代码



我用字典给每一天都标了跑多少,然后每月求和加到km上。
最后少的数还特别巧,8843 与网上的8879差一个 10月1号(不含)往后的里程数+上11月的第一天,找了好久也没发现问题所在,求解谢谢


核对了几年中的几天,每天跑的里程数正确
最佳答案
2021-7-7 01:21:00
哎,给你仔细分析一下你的代码,问题出在for day in range(1,m_day+1):循环体内:
  1. #分析一下当n大余7的时候运行情况
  2. if n < 7:                    #当n大余7的时候,运行else部分
  3.         if day == 1:
  4.                 di_w[day] = 2
  5.                 n += 1
  6.         else:
  7.                 di_w[day] = week[n]
  8.                 n += 1
  9. else:
  10.         n = 0                #将n重置为0,也就是week中第一位,是周六
  11.         di_w[day] = week[n]  #当天的步数是week[0],也就是1步,无论当天是否是1号
  12.         n += 1               #n加1,也就是0+1=1后进入下一循环,因此在第一轮循环以后,n不会再有值为0进入循环体的时候了,所有的周六都会在else中赋值为1,无论是否是1号
复制代码

    所以,除了第一次循环中的周六数据会判断是否是1号,而之后所有的周六都是走else部分,无论是否是1号,都是只赋值为1,所以先前在你的代码基础上直接修改,在else里面加入判断是否是1号的部分,你运行一下修改后的代码看看结果是否正确。
    不过这样修改,重复代码太多,可以优化一下:
  1. if day == 1:              #首先判断判断是否是1号,是的话直接赋值2
  2.         di_w[day] = 2
  3. else:
  4.         di_w[day] = week[n]     #不是1号就根据星期几来赋值
  5. n += 1               
  6. if n == 7:                 #n值等于7了就复位为0,下一轮会依旧判断是否是1号
  7.     n = 0
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-6-6 22:25:31 | 显示全部楼层
刚才题目搞错了 不好意思
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-7 12:29:04 | 显示全部楼层
python的优点是各种模块,所以,能用模块解决问题就不要自己去整太多了。
  1. import datetime
  2. be_date=datetime.date(2000,1,1)
  3. end_date=datetime.date(2020,10,1)
  4. run_lenth=0
  5. while be_date<=end_date:
  6.     if be_date.isoweekday()==1 or be_date.day==1:
  7.         run_lenth+=2
  8.     else:
  9.         run_lenth+=1
  10.     be_date+=datetime.timedelta(1)
  11. print(run_lenth)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


  1. li_run = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
  2. li_ping = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

  3. # 每年多少天
  4. di_n = {}
  5. for i in range(2000,2021):
  6.         if i % 4 == 0 and i % 100 != 0:
  7.                 di_n[i] = li_run
  8.         elif i % 400 == 0:
  9.                 di_n[i] = li_run
  10.         else:
  11.                 di_n[i] = li_ping
  12. di_n[2020] = di_n[2020][:9]

  13. # 2000.1.1周6
  14. week = [1,1,2,1,1,1,1]
  15. # 存每天跑多少km
  16. di_w = {}

  17. km = 0
  18. year = 2000
  19. n = 0
  20. while year != 2021:
  21.         for m_day in di_n[year]:

  22.                 for day in range(1,m_day+1):
  23.                         if n < 7:
  24.                                 if day == 1:
  25.                                         di_w[day] = 2
  26.                                         n += 1
  27.                                 else:
  28.                                         di_w[day] = week[n]
  29.                                         n += 1
  30.                         else:
  31.                                 n = 0
  32.                                 if day == 1:                 #这是周六时候执行的代码,如果不加判断,无论是不是1号都+1
  33.                                         di_w[day] = 2
  34.                                         n += 1
  35.                                 else:
  36.                                         di_w[day] = week[n]
  37.                                         n += 1
  38.                 km += sum(di_w.values())
  39.                 if year == 2020:
  40.                         print(di_w)
  41.                         print(km)
  42.                 di_w.clear()
  43.         year += 1
  44. print(km+2)
  45. # 8879
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我看到这个了
但我没找出我错在哪了(错的还特巧),随便检查了下日期和走的历程对应的都正确
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

没看到我的第二个回复?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

好长时间没来了谢谢大佬回答
您注释的地方 1号的时候我是加2的呀
  1. di_w[day] = 2
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

你加2的代码是31行,是n小于7时执行的代码,我修改的代码在38行,是n等于7时执行的代码。
小甲鱼最新课程 -> https://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 就是判断是否为一号的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-7 01:21:00 | 显示全部楼层    本楼为最佳答案   
哎,给你仔细分析一下你的代码,问题出在for day in range(1,m_day+1):循环体内:
  1. #分析一下当n大余7的时候运行情况
  2. if n < 7:                    #当n大余7的时候,运行else部分
  3.         if day == 1:
  4.                 di_w[day] = 2
  5.                 n += 1
  6.         else:
  7.                 di_w[day] = week[n]
  8.                 n += 1
  9. else:
  10.         n = 0                #将n重置为0,也就是week中第一位,是周六
  11.         di_w[day] = week[n]  #当天的步数是week[0],也就是1步,无论当天是否是1号
  12.         n += 1               #n加1,也就是0+1=1后进入下一循环,因此在第一轮循环以后,n不会再有值为0进入循环体的时候了,所有的周六都会在else中赋值为1,无论是否是1号
复制代码

    所以,除了第一次循环中的周六数据会判断是否是1号,而之后所有的周六都是走else部分,无论是否是1号,都是只赋值为1,所以先前在你的代码基础上直接修改,在else里面加入判断是否是1号的部分,你运行一下修改后的代码看看结果是否正确。
    不过这样修改,重复代码太多,可以优化一下:
  1. if day == 1:              #首先判断判断是否是1号,是的话直接赋值2
  2.         di_w[day] = 2
  3. else:
  4.         di_w[day] = week[n]     #不是1号就根据星期几来赋值
  5. n += 1               
  6. if n == 7:                 #n值等于7了就复位为0,下一轮会依旧判断是否是1号
  7.     n = 0
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-21 23:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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