吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2083|回复: 25
收起左侧

[Python 转载] 【新手】小白用python解小学奥数第三集

  [复制链接]
zhang1497 发表于 2020-8-26 13:38
本帖最后由 zhang1497 于 2020-8-26 19:11 编辑

前言
因为工作的关系,长期教小学数学奥数,最近接触到python,学到了while;for 语句这里,于是就有了这个想法:用python解奥数题

1. 订立制作目标
  • 目标:
    • 打印题目
    • 输出答案


2.制作所需函数
打印题目 → print函数
所需知识 →序列、序列长度、序列元素

3. 开始制作第一步:打印题目
[Python] 纯文本查看 复制代码
print('''
求下图中线段长度的总和。(单位:厘米)

  1      4       2      3
├───┼─────────┼─────┼—────——┤
A   B         C     D       E
''')                  #用三单引号输入题目


第二步:制作解题代码
[Python] 纯文本查看 复制代码
num = [1, 4, 2, 3]  # 把这4个数放在一个序列中
n = len(num) + 1    # 解题需要用到点,4条线段即5个端点
l = int(num[0]) * (n - 1) * 1 + int(num[1]) * (n - 2) * 2 + int(num[2]) * (n - 3) * 3 + int(num[3]) * (n - 4) * 4
                    # 解题逻辑1:打枪法求和
                    # 解题逻辑2:重复相加时,同一条线段出现的次数。(本题逻辑代码)
print("答案是:", l, "厘米。")  # 代码的局限性体现在l的表达上,我实在想不透用while for怎么表达。


第三步:运行代码
搜狗截图20200826130729.png

说明 :中途自闭了一天,因为我实在想不到怎么用while for if 等语句来表达解题逻辑,才使得现在解题代码冗长,不舒服,因为这种题型是有固定模式的,可以把元素用input输入,然后求元素总和,可以按照一定规律重复相加,规律如下:
逻辑1(打枪法):L = 元素1 + (元素1+元素2) +(元素1+元素2+元素3)+(元素1+元素2+元素3+元素4)+ 元素2 + (元素2+元素3)+(元素2+元素3+元素4)+ 元素3 + (元素3+元素4)+ 元素4  
逻辑2(重复出现的次数):L = 元素1 × (端点数-1)×1 + 元素2 × (端点数-2)×2 + 元素3 × (端点数-3)×3 + 元素4× (端点数-4)×4
L = a1× (n-1)×1 + a2× (n-2)×2 + a3× (n-3)×3 + a4× (n-4)×4 …… an×1×(n-1)
后来我想明白一件事,不要气馁(nei),实战中不懂就多问问吾友,求吾友解我疑惑。求大神教我如果表达 逻辑1 和逻辑2


在这里我解释一下,并不是求AE的长度,是求所有能组成线段的长度的总和。如果是求AE的长度,直接  L = sum(num) 就好了。


@Loker 提供的逻辑代码
[Python] 纯文本查看 复制代码
我是这么分析的:
    假设每一个小段为一个基本线段,由线段a,b,c,d表示
    所有线段类型:
        一个基本线段: a + b + c + d
        两个基本线段: ab + bc + cd
        三个基本线段: abc + bcd
        四个基本线段: abcd
num = [1, 4, 2, 3]
sum = 0
for i in range(4):# 循环四种情况
    for j in range(len(num)):
        if j + i < len(num):
            if i == 0:
                sum = sum + num[j]
            if i == 1:
                sum = sum + num[j] + num[j+1]
            if i == 2:
                sum = sum + num[j] + num[j+1] + num[j+2]
            if i == 3:
                sum = sum + num[j] + num[j+1] + num[j+2] + num[j+3]
print sum
  

免费评分

参与人数 3吾爱币 +4 热心值 +2 收起 理由
苏紫方璇 + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
cui_boran + 1 加油^0^~
黄明礼 + 1 nb

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Loker 发表于 2020-8-26 15:03
思路不一定对,代码不一定对,仅供参考,欢迎指正。
[Python] 纯文本查看 复制代码
我是这么分析的:
    假设每一个小段为一个基本线段,由线段a,b,c,d表示
    所有线段类型:
        一个基本线段: a + b + c + d
        两个基本线段: ab + bc + cd
        三个基本线段: abc + bcd
        四个基本线段: abcd
num = [1, 4, 2, 3]
sum = 0
for i in range(4):# 循环四种情况
    for j in range(len(num)):
        if j + i < len(num):
            if i == 0:
                sum = sum + num[j]
            if i == 1:
                sum = sum + num[j] + num[j+1]
            if i == 2:
                sum = sum + num[j] + num[j+1] + num[j+2]
            if i == 3:
                sum = sum + num[j] + num[j+1] + num[j+2] + num[j+3]
print sum
Loker 发表于 2020-8-27 12:58
zhang1497 发表于 2020-8-27 12:06
我输入以后看了,并不是大佬的问题,而是我的问题,我是萌新,刚看书看到序列元素这里,所以很多不懂,比 ...

我也是python的初学者,共同进步,哈哈
[Python] 纯文本查看 复制代码
'''
逻辑1(打枪法):
L = 元素1 + (元素1+元素2) +(元素1+元素2+元素3)+(元素1+元素2+元素3+元素4)+ 
    元素2 + (元素2+元素3)+(元素2+元素3+元素4)+ 
    元素3 + (元素3+元素4)+ 
    元素4  
'''
# 定义一个方法,计算数组arr中start项到end项的和(arr[start]和arr[end]都包含在内)
def sumArr(arr, start, end):
    # 存储结算的总结果
    total = 0
    # 循环遍历数组内所有元素
    for i in range(len(arr)):
        # 判断当前元素是不是在给定范围内
        if i >= start and i <=end:
            # 如果在给定范围内的话就加起来
            total = total + arr[i]
    # 把最后的结果返回出去
    return total

# 写法二
def sumArr2(arr, start, end):
    # 存储结算的总结果
    total = 0
    # 循环遍历范围内所有元素
    for i in range(start, end + 1):
        total = total + arr[i]
    # 把最后的结果返回出去
    return total


# 目标数组
arr = [1, 4, 2, 3]

# 用于存储最后的结果
sum = 0

# 要注意的是,数组下标都是从 0 开始的

# 列出所有可能的情况,数组长度为4,那就是4种
for i in range(len(arr)):
    # print('i:', i)    # i 分别为0, 1, 2, 3
    # len(arr) - i 就是每一次情况要加几次,例如:
    '''
        第一次循环要加4次:元素1 + (元素1+元素2) +(元素1+元素2+元素3)+(元素1+元素2+元素3+元素4)
        第二次循环要加3次:元素2 + (元素2+元素3)+(元素2+元素3+元素4)
        第三次循环要加2次:元素3 + (元素3+元素4
        第四次循环要加1次:元素4
    '''
    # 而len(arr) - i  ,就是在上一层循环后(0, 1, 2, 3)拼凑出要加的次数(3, 2, 1, 0)
    for j in range(len(arr) - i):
        # print('j:', j)
        '''
            分别加(数字代表下标)
                0, 0-1, 0-1-2, 0-1-2-3        第一次循环就是从下标为0元素开始(start = 0)到下标为1,2,3(end = 0, 1, 2, 3)的元素相加,共四次
                1, 1-2, 1-2-3                 第二次循环就是从下标为1元素开始(start = 1)到下标为1,2,3(end = 1, 2, 3)的元素相加,共三次
                2, 2-3                        第三次循环就是从下标为2元素开始(start = 2)到下标为1,2,3(end = 2, 3)的元素相加,共二次
                3                             第四次循环就是从下标为2元素开始(start = 3)到下标为1,2,3(end = 3)的元素相加,共一次
        '''
        sum = sum + sumArr(arr, i, i+j)

print(sum)

leasae 发表于 2020-8-26 13:47
天道法海 发表于 2020-8-26 14:03
- -我数学比较差,没看明白。。。。为什么要这样呢?如果要线段总和,为什么不直接h = 0    for(i =0;i < len(num);i++): h+=num[i]  ?
 楼主| zhang1497 发表于 2020-8-26 14:18
天道法海 发表于 2020-8-26 14:03
- -我数学比较差,没看明白。。。。为什么要这样呢?如果要线段总和,为什么不直接h = 0    for(i =0;i < l ...

大佬,代码运行不了
fortytwo 发表于 2020-8-26 14:25
题目..我没看懂。
求和?
[Python] 纯文本查看 复制代码
num = [1, 4, 2, 3]
res = 0
for item in num:
    res = res + item
print(res)
 楼主| zhang1497 发表于 2020-8-26 14:28
SailZhao520 发表于 2020-8-26 14:25
题目..我没看懂。
求和?
[mw_shl_code=python,true]num = [1, 4, 2, 3]

不是,并非AE的长度,是求所有能组成线段长度的总和。,如果是求元素和的话  直接 sum(num)就好了。
 楼主| zhang1497 发表于 2020-8-26 16:07
Loker 发表于 2020-8-26 15:03
思路不一定对,代码不一定对,仅供参考,欢迎指正。
[mw_shl_code=python,true]我是这么分析的:
    假 ...

首先膜拜下大佬,你的思路应该是属于第三种解题思路,奥数的魅力就是这样!学习了!
情况1:一条线段的情况 a+b+c+d
情况2:两条线段的情况 ab+bc+cd
情况3:三条线段的情况 abc+bcd
情况4:四条线段的情况 abcd
所有 情况 相加的 总和就是 总线段长度。
代码是对的,解题思路也是对的。现在提出这个问题了,就看有没有大佬能够简化这个逻辑。
fortytwo 发表于 2020-8-26 17:07
zhang1497 发表于 2020-8-26 16:07
首先膜拜下大佬,你的思路应该是属于第三种解题思路,奥数的魅力就是这样!学习了!
情况1:一条线段的 ...

感觉这个就是普通的排列组合算法...最近也在研究这个。我想想,有结果了给你说下
 楼主| zhang1497 发表于 2020-8-26 17:18
SailZhao520 发表于 2020-8-26 17:07
感觉这个就是普通的排列组合算法...最近也在研究这个。我想想,有结果了给你说下

好的,我也正在往后学,看看get到哪节课知识能解。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 03:36

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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