zhang1497 发表于 2020-8-24 12:06

【新手】小白用python解小学奥数第二集

本帖最后由 zhang1497 于 2020-8-24 22:29 编辑

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

1. 订立制作目标
[*]目标:

[*]打印题目
[*]输出答案

2.制作所需函数打印题目 → print函数
满足的条件 →while循环语句3. 开始制作第一步:打印题目
print("甲、乙、丙三数的和是78,甲数比乙数的2倍多4,"# 老样子题目太长用“”换行
      "乙数比丙数的3倍少2。求这三个数。\n")         # \n和 下面答题空一行
第二步:制作while循环
sum = 0                                       # 起始值
while True:
    if sum * 3 - 2 + (sum * 3 - 2) * 2 + 4 + sum == 78:
      print("答:甲是", b, "乙是", a, "丙是", sum)
      break                                          # 循环结束
第三步:补充未定义的a和b
print("甲、乙、丙三数的和是78,甲数比乙数的2倍多4,"# 老样子题目太长用“”换行
      "乙数比丙数的3倍少2。求这三个数。\n")         # \n和 下面答题空一行
sum = 0                                       # 起始值
while True:
    if sum * 3 - 2 + (sum * 3 - 2) * 2 + 4 + sum == 78:
       print("答:甲是", b, "乙是", a, "丙是", sum)
       break                                          # 循环结束
    sum += 1                                             # sum +=1 写在后面美观
    a = sum * 3 - 2                                    # a和b需要在循环之后被定义,
    b = (sum*3-2)*2+4                                    #在while循环结束后,定义之前print内a和b的值
4. 第N次运行运行截图:

https://raw.githubusercontent.com/pky2006/photo/master/20200823155609.png
非常成功,没有报错


5.我的第一次错误示范
第一次编写代码(错误示范)
sum = 0
a = sum*3-2                  代码执行自上而下
b = (sum*3-2)*2+4            那么a和b就早已赋值了
while True:
    ifa + b + sum == 78:
      print("甲是",b,"乙是",a,"丙是",sum)    输出0 -2 78 并非答案
      break
    sum += 1


我的第二次错误示范
sum = 0
while True:
    a = sum*3-2                     #提示a和b未被定义
    b = (sum*3-2)*2+4               #说明a和b需要在循环之前被定义,或者循环之后被定义。
    ifa + b + sum == 78:          #根据第一次错误示范,a和b应该是在循环之后被定义。
      print("甲是",b,"乙是",a,"丙是",sum)
      break
    sum += 1                        #循环+1 直到找到符合条件的答案。

这样应该能够对while进一步加深应用了,这里非常感谢吾友:ukyodz吾友:wuyangteam对我的指导,我对第三行的解释代码不太满意,还能再简写吗?

wuyangteam 发表于 2020-8-24 20:42

本帖最后由 wuyangteam 于 2020-8-24 20:49 编辑

```python
sum = 0
# a = 0            
# b = 0         
while True:
    a = sum * 3 - 2
    b = (sum*3-2)*2+4
    ifa + b + sum == 78:
      print("甲是",b,"乙是",a,"丙是",sum)
      break
    sum += 1
```
这个是对的,python并不一定需要事前先定义,我用的python3.8编译,没有错。那么你可能会问为啥sum要先给个0,因为sum如果事先不给个初值,进入while后,编译器并不知道它是个啥啊,值为多少啊,而a,b都是可以根据sum的值计算出来的。
再次sum += 1这个不是为了好看才放后面的。因为while循环,第一次循环,sum = 0,如果你将sum + =1 这句话,放在前面,例如:
```python
while True:
    sum += 1
    a = sum * 3 - 2
    b = (sum*3-2)*2+4
    ifa + b + sum == 78:
      print("甲是",b,"乙是",a,"丙是",sum)
      break
```
那么第一次循环的时候sum就等于1, 所以放在哪里,与你的逻辑有关,就本题而言,该从0,开始还是1开始呢,无论sum=0,还是1,式子子a+b+sum都不等于78,所以这里,得到的程序输出结果是一样的。

Loker 发表于 2020-8-24 14:11

不考虑运算效率的话,单纯把文字语言描绘出来的话可以是这样: if a + b + c == 78 and a == b * 2 + 4 and b == c * 3 - 2:
# 定义abc分别为甲乙丙
a = 0
b = 0
c = 0
for a in range(0,78):
    for b in range(0,78):
      for c in range(0,78):
            # 甲、乙、丙三数的和是78,甲数比乙数的2倍多4,乙数比丙数的3倍少2
            if a + b + c == 78 and a == b * 2 + 4 and b == c * 3 - 2:
                print("number a is: ", a, "\nnumber b is: ", b, "\nnumber c is: ", c)

ilavac 发表于 2020-8-24 12:29

不错,支持

reson 发表于 2020-8-24 13:25

没想到吧 发表于 2020-8-24 14:03

支持一下,支持一下

zhang1497 发表于 2020-8-24 14:15

Loker 发表于 2020-8-24 14:11
不考虑运算效率的话,单纯把文字语言描绘出来的话可以是这样: if a + b + c == 78 and a == b * 2 + 4 and ...

学到了,这个逻辑可以,期待还有大神能够简化的。

l943644670 发表于 2020-8-24 14:29

支持- -不过小学生要是会python写这个,估计奥数题也不在话下了吧啊

lsy832 发表于 2020-8-24 14:29

学以致用啊   感觉这样一下对while循环的理解深刻了一些 ,我在刚学习按键精灵的DO loop这个循环也是出现了跟你一样的第一次循环的错误示范

旋风中的小聪明 发表于 2020-8-24 14:45

微笑着面对奥数题,干了它,哦你给

halfone 发表于 2020-8-24 14:50

48 22 8 {:1_904:}
页: [1] 2
查看完整版本: 【新手】小白用python解小学奥数第二集