鱼C论坛

 找回密码
 立即注册
查看: 31|回复: 1

[已解决]零基础Python 11讲 作业咨询

[复制链接]
发表于 昨天 17:33 | 显示全部楼层 |阅读模式

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

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

x
#向大佬们求教:
# 由于目标值必须是能被7整除,所以我们将测试每个7的倍数
steps = 7
i = 1
FIND = False

while i < 100:
    # 由于测试的都是7的倍数
    # 因此只要同时满足除以2余1、除以3余2、除以5余4、除以6余5,就是最终的结果
    if (steps % 2 == 1) and (steps % 3 == 2) and (steps % 5 == 4) and (steps % 6 == 5):
        FIND = True
        break
    else:
        steps = 7 * (i + 1)    #这里我用  steps = steps * (i+1)为什么会出现错误的结果呢
    i = i + 1

if FIND == True:
    print('阶梯数是:', steps)
else:
    print('在程序限定的范围内找不到答案!')
最佳答案
昨天 17:36
鱼油的问题在于循环中更新 `steps` 的方式不正确。原代码使用 `steps = 7 * (i + 1)` 是正确的,因为它按顺序枚举 7 的倍数(7, 14, 21, ...)。但若改为 `steps = steps * (i + 1)` 会导致值指数级增长(7 → 14 → 42 → 168 → ...),跳过中间的解(如 119)。

### 错误原因分析
假设使用 `steps = steps * (i + 1)`:
1. 初始:`steps=7`, `i=1`
2. 第一次循环:不满足条件 → `steps = 7 * (1+1) = 14`, `i=2`
3. 第二次循环:不满足条件 → `steps = 14 * (2+1) = 42`, `i=3`
4. 第三次循环:不满足条件 → `steps = 42 * (3+1) = 168`, `i=4`  
   此时跳过 21、28、35 等值,包括正确解 119。

### 正确写法推荐
使用线性增长(每次加 7)更直观:
[code=python]
steps = 7
i = 1
FIND = False

while i < 100:
    if (steps % 2 == 1) and (steps % 3 == 2) and (steps % 5 == 4) and (steps % 6 == 5):
        FIND = True
        break
    else:
        steps += 7  # 每次增加 7,确保枚举所有 7 的倍数
    i += 1

if FIND:
    print('阶梯数是:', steps)
else:
    print('在程序限定的范围内找不到答案!')
[/code]

### 为什么原代码的 `steps = 7 * (i+1)` 正确?
- 它等价于枚举 `i+1` 的 7 倍:  
  `i=1` → `steps=7*2=14`  
  `i=2` → `steps=7*3=21`  
  ...  
  `i=17` → `steps=7*18=126`(实际需 `119=7*17`,但注意初始 `steps=7` 对应 `i=1` 时已检查过 7)
- 最终在 `i=17` 时找到 `steps=119`(因为 `119=7*17`,而循环中 `i=17` 时 `steps=7*(17+1)=126`?需调整初始值逻辑)

### 更简洁的写法(推荐)
[code=python]
# 直接枚举 7 的倍数(7 到 700)
for steps in range(7, 700, 7):  # 从 7 开始,步长为 7
    if (steps % 2 == 1) and (steps % 3 == 2) and (steps % 5 == 4) and (steps % 6 == 5):
        print('阶梯数是:', steps)
        break
else:  # 循环正常结束(未 break)时执行
    print('在程序限定的范围内找不到答案!')
[/code]

### 关键点
- 错误写法 `steps = steps * (i+1)` 破坏了枚举的线性顺序
- 正确做法是确保每次增加固定步长 7

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 17:36 | 显示全部楼层    本楼为最佳答案   
鱼油的问题在于循环中更新 `steps` 的方式不正确。原代码使用 `steps = 7 * (i + 1)` 是正确的,因为它按顺序枚举 7 的倍数(7, 14, 21, ...)。但若改为 `steps = steps * (i + 1)` 会导致值指数级增长(7 → 14 → 42 → 168 → ...),跳过中间的解(如 119)。

### 错误原因分析
假设使用 `steps = steps * (i + 1)`:
1. 初始:`steps=7`, `i=1`
2. 第一次循环:不满足条件 → `steps = 7 * (1+1) = 14`, `i=2`
3. 第二次循环:不满足条件 → `steps = 14 * (2+1) = 42`, `i=3`
4. 第三次循环:不满足条件 → `steps = 42 * (3+1) = 168`, `i=4`  
   此时跳过 21、28、35 等值,包括正确解 119。

### 正确写法推荐
使用线性增长(每次加 7)更直观:
[code=python]
steps = 7
i = 1
FIND = False

while i < 100:
    if (steps % 2 == 1) and (steps % 3 == 2) and (steps % 5 == 4) and (steps % 6 == 5):
        FIND = True
        break
    else:
        steps += 7  # 每次增加 7,确保枚举所有 7 的倍数
    i += 1

if FIND:
    print('阶梯数是:', steps)
else:
    print('在程序限定的范围内找不到答案!')
[/code]

### 为什么原代码的 `steps = 7 * (i+1)` 正确?
- 它等价于枚举 `i+1` 的 7 倍:  
  `i=1` → `steps=7*2=14`  
  `i=2` → `steps=7*3=21`  
  ...  
  `i=17` → `steps=7*18=126`(实际需 `119=7*17`,但注意初始 `steps=7` 对应 `i=1` 时已检查过 7)
- 最终在 `i=17` 时找到 `steps=119`(因为 `119=7*17`,而循环中 `i=17` 时 `steps=7*(17+1)=126`?需调整初始值逻辑)

### 更简洁的写法(推荐)
[code=python]
# 直接枚举 7 的倍数(7 到 700)
for steps in range(7, 700, 7):  # 从 7 开始,步长为 7
    if (steps % 2 == 1) and (steps % 3 == 2) and (steps % 5 == 4) and (steps % 6 == 5):
        print('阶梯数是:', steps)
        break
else:  # 循环正常结束(未 break)时执行
    print('在程序限定的范围内找不到答案!')
[/code]

### 关键点
- 错误写法 `steps = steps * (i+1)` 破坏了枚举的线性顺序
- 正确做法是确保每次增加固定步长 7

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-13 02:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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