鱼C论坛

 找回密码
 立即注册
查看: 30|回复: 5

[作品展示] 萌新打卡:零基础入门学习Python(最新版),第11讲课后编程作业答案分享交流

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式

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

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

x
一种不同于版主答案的新答案,尽管非常相似,但是是我一点点摸出来的
感觉还挺简洁的(因为没用类似于steps之类的字符来表示,以后尽量用英文表示
版权问题,就不附上题目图片啦

  1. x = 0
  2. y = int(input("请设定搜索范围:"))
  3. z = False#用以检验
  4. while x < y:#设定范围y
  5.     if x % 2 == 1 and x % 3 == 2 and x % 5 == 4 and x % 6 == 5 and x % 7 == 0:
  6.         print(x)
  7.         z = True
  8.         break
  9.     else :
  10.         x += 1
  11. if z:
  12.     print(z)
  13. else:
  14.     print("范围内无此数")
复制代码



每天发发,水一水贴awa
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层
首先,感谢你分享自己的代码!作为新手,能够独立摸索出解决方案是非常棒的进步。你的代码逻辑基本正确,能够在一定范围内搜索满足条件的数。这里有一些小建议可以帮助代码更加清晰和规范。

### 代码分析
你的代码使用 while 循环遍历范围,并通过布尔变量 z 来检查是否找到目标数。不过,在找到数后,你打印了 xz,这会导致输出类似 119True 的两行,可能不是最理想的。通常我们只需打印找到的数即可。

### 改进建议
1. **变量命名**:使用英文命名可以提高代码可读性,例如用 upper_limit 代替 y,用 found 代替 z
2. **循环结构**:使用 for 循环可以简化代码,避免手动管理计数器。
3. **输出清晰化**:找到数时打印明确的消息,未找到时给出提示。

以下是调整后的代码示例:


  1. upper_limit = int(input("请设定搜索范围: "))
  2. found = False

  3. for num in range(upper_limit):
  4.     if num % 2 == 1 and num % 3 == 2 and num % 5 == 4 and num % 6 == 5 and num % 7 == 0:
  5.         print(f"找到满足条件的数: {num}")
  6.         found = True
  7.         break

  8. if not found:
  9.     print("范围内无此数")
复制代码


### 说明
- 这段代码从 0 开始搜索到 upper_limit - 1,符合你原代码的逻辑。如果希望从 1 开始,可以将 range(upper_limit) 改为 range(1, upper_limit)
- 条件部分保留了所有检查,确保与题目要求一致。实际上,num % 6 == 5 已经隐含了 num % 2 == 1num % 3 == 2,但为了清晰,你可以根据需求决定是否简化。

继续加油,期待看到你更多的分享!如果有其他问题,随时交流。

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

使用道具 举报

 楼主| 发表于 2 小时前 | 显示全部楼层
看着虽然简洁,但是相对比版主的代码,这个运算量可能更大一点
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层
HT_prandme 发表于 2026-01-18 16:40
看着虽然简洁,但是相对比版主的代码,这个运算量可能 ...


你说得对!从运算效率的角度看,直接遍历所有数字确实计算量更大。让我们来比较一下不同方法的思路:

### 两种思路对比

**你的方法(遍历法)**:
  1. for num in range(upper_limit):
  2.     if num % 2 == 1 and num % 3 == 2 and num % 5 == 4 and num % 6 == 5 and num % 7 == 0:
复制代码


* 优点:思路直接,容易理解
* 缺点:每个数字都要进行5次求余运算,计算量大

**优化方法(数学法)**:
  1. for i in range(7, upper_limit, 7):
  2.     if i % 2 == 1 and i % 3 == 2 and i % 5 == 4 and i % 6 == 5:
复制代码


* 优点:只检查7的倍数,减少了检查范围
* 解释:因为题目要求 x % 7 == 0,所以可以直接从7开始,每次增加7

### 进一步优化

其实还有更优的数学方法,观察条件可以发现:
1. x % 2 == 1 说明 x 是奇数
2. x % 6 == 5 已经包含了 x % 2 == 1x % 3 == 2
3. 所以条件可以简化为:x % 5 == 4x % 6 == 5x % 7 == 0

最精简的数学推导是:x+1 是 2,3,5,6 的公倍数,也就是30的倍数,同时 x 是7的倍数。所以:
  1. for k in range(1, upper_limit // 30 + 2):
  2.     x = 30 * k - 1
  3.     if x <= upper_limit and x % 7 == 0:
  4.         print(f"找到满足条件的数: {x}")
  5.         break
复制代码


这种方法只需要检查大约 upper_limit/30 次,比你的方法快30倍!

### 实际测试

假设搜索范围是1000:
* 你的方法:检查1000次
* 优化方法1(只查7的倍数):检查约143次
* 优化方法2(数学推导):检查约33次

不过别灰心!作为初学者,你的代码已经很棒了。先写出能解决问题的代码,再考虑优化,这是完全正确的学习路径。随着学习的深入,你自然会掌握更多优化技巧。

继续保持这份探索精神,期待看到你更多的进步!

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

使用道具 举报

 楼主| 发表于 2 小时前 | 显示全部楼层
FishC 发表于 2026-1-18 16:40
首先,感谢你分享自己的代码!作为新手,能够独立摸索出解决方案是非常棒的进步。你的代码逻辑基本正确,能 ...

哎呀,代码忘改了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层
HT_prandme 发表于 2026-01-18 16:41
FishC 发表于 2026-1-18 16:40
首先,感谢你分享自己 ...


首先,为你的探索精神点赞!能够独立思考并实现代码,这是学习编程最宝贵的一步。  

关于你提到的运算量问题,确实值得探讨。让我们从数学角度来优化这个搜索问题:  

### 数学优化思路  
题目要求找到一个数 x,满足:  
1. x % 2 == 1  
2. x % 3 == 2  
3. x % 5 == 4  
4. x % 6 == 5  
5. x % 7 == 0  

仔细观察,条件 4(x % 6 == 5)已经隐含了条件 1 和 2,因为一个数除以 6 余 5,它一定是奇数(满足条件1),且除以 3 余 2(满足条件2)。所以我们可以简化条件为:  

* x % 5 == 4  
* x % 6 == 5  
* x % 7 == 0  

### 高效搜索方法  
由于 x 必须是 7 的倍数,我们可以只遍历 7 的倍数,这样搜索范围减少到原来的 1/7:  

upper_limit = int(input("请设定搜索范围: "))  
found = False  

for num in range(7, upper_limit, 7):  
    if num % 5 == 4 and num % 6 == 5:  
        print(f"找到满足条件的数: {num}")  
        found = True  
        break  

if not found:  
    print("范围内无此数")  

### 更进一步的数学推导  
其实,我们还可以利用同余方程组来直接求解。  
由 x % 5 == 4 和 x % 6 == 5,可以推出 x + 1 同时是 5 和 6 的倍数,即 x + 1 是 30 的倍数。  
设 x + 1 = 30k(k 为正整数),则 x = 30k - 1。  
又因为 x 是 7 的倍数,即 30k - 1 ≡ 0 (mod 7),化简得 30k ≡ 1 (mod 7),30 mod 7 = 2,所以 2k ≡ 1 (mod 7),解得 k ≡ 4 (mod 7)。  
因此 k = 7m + 4,代入得 x = 30*(7m+4) - 1 = 210m + 119。  
所以最小解是 119,之后每次加 210 都是解。  

这样我们可以直接输出所有解,无需遍历:  

upper_limit = int(input("请设定搜索范围: "))  
start = 119  
if start < upper_limit:  
    for x in range(start, upper_limit, 210):  
        print(x)  
else:  
    print("范围内无此数")  

### 总结  
你的原始代码已经正确,通过数学分析可以大幅提升效率。编程不仅是写代码,更是思考如何更优雅地解决问题。继续保持这种探索精神,你会进步更快!

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-18 18:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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