头发 发表于 2021-6-6 22:20:11

Python蓝桥杯c题我这咋错了??

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

https://img-blog.csdnimg.cn/20210315175731242.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMxOTEwNjY5,size_16,color_FFFFFF,t_70#pic_center


li_run =
li_ping =

# 每年多少天
di_n = {}
for i in range(2000,2021):
        if i % 4 == 0 and i % 100 != 0:
                di_n = li_run
        elif i % 400 == 0:
                di_n = li_run
        else:
                di_n = li_ping
di_n = di_n[:9]

# 2000.1.1周6
week =
# 存每天跑多少km
di_w = {}

km = 0
year = 2000
n = 0
while year != 2021:
        for m_day in di_n:

                for day in range(1,m_day+1):
                        if n < 7:
                                if day == 1:
                                        di_w = 2
                                        n += 1
                                else:
                                        di_w = week
                                        n += 1
                        else:
                                n = 0
                                di_w = week
                                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-6-6 22:25:31

刚才题目搞错了 不好意思

txxcat 发表于 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)

txxcat 发表于 2021-6-7 13:20:34

你的算法bug是如果1号是周六就不会计2公里,具体位置看注释

li_run =
li_ping =

# 每年多少天
di_n = {}
for i in range(2000,2021):
      if i % 4 == 0 and i % 100 != 0:
                di_n = li_run
      elif i % 400 == 0:
                di_n = li_run
      else:
                di_n = li_ping
di_n = di_n[:9]

# 2000.1.1周6
week =
# 存每天跑多少km
di_w = {}

km = 0
year = 2000
n = 0
while year != 2021:
      for m_day in di_n:

                for day in range(1,m_day+1):
                        if n < 7:
                              if day == 1:
                                        di_w = 2
                                        n += 1
                              else:
                                        di_w = week
                                        n += 1
                        else:
                              n = 0
                              if day == 1:               #这是周六时候执行的代码,如果不加判断,无论是不是1号都+1
                                        di_w = 2
                                        n += 1
                              else:
                                        di_w = week
                                        n += 1
                km += sum(di_w.values())
                if year == 2020:
                        print(di_w)
                        print(km)
                di_w.clear()
      year += 1
print(km+2)
# 8879。

头发 发表于 2021-6-7 13:21:34

txxcat 发表于 2021-6-7 12:29
python的优点是各种模块,所以,能用模块解决问题就不要自己去整太多了。

我看到这个了
但我没找出我错在哪了(错的还特巧),随便检查了下日期和走的历程对应的都正确

txxcat 发表于 2021-6-9 22:22:08

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

没看到我的第二个回复?

头发 发表于 2021-7-2 12:42:06

txxcat 发表于 2021-6-7 13:20
你的算法bug是如果1号是周六就不会计2公里,具体位置看注释。

好长时间没来了谢谢大佬回答{:10_254:}
您注释的地方 1号的时候我是加2的呀 di_w = 2

txxcat 发表于 2021-7-3 00:13:11

头发 发表于 2021-7-2 12:42
好长时间没来了谢谢大佬回答
您注释的地方 1号的时候我是加2的呀

你加2的代码是31行,是n小于7时执行的代码,我修改的代码在38行,是n等于7时执行的代码。

头发 发表于 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 就是判断是否为一号的{:10_254:}

txxcat 发表于 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 = 2
                n += 1
      else:
                di_w = week
                n += 1
else:
      n = 0                #将n重置为0,也就是week中第一位,是周六
      di_w = week#当天的步数是week,也就是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 = 2
else:
      di_w = week   #不是1号就根据星期几来赋值
n += 1               
if n == 7:               #n值等于7了就复位为0,下一轮会依旧判断是否是1号
    n = 0

页: [1]
查看完整版本: Python蓝桥杯c题我这咋错了??