当前位置: 首页 > news >正文

Python趣味编程实战:从数学谜题到数据处理

1. 数学谜题的Python解法

数学谜题是编程入门的绝佳练习素材。我刚开始学Python时,就特别喜欢用代码解决各种数学问题。比如这个经典题目:找出所有百位是3、十位是6,且能被2和3整除的四位数。

numbers = range(1000, 10000) result = [] for num in numbers: if (num // 100 % 10 == 3 and num // 10 % 10 == 6 and num % 6 == 0): # 同时被2和3整除就是被6整除 result.append(num) print(f"最大数:{max(result)},最小数:{min(result)}")

这个解法有几个优化点:

  1. //整除运算符替代int()转换更高效
  2. 直接判断能否被6整除,减少一个条件判断
  3. 使用列表推导式可以更简洁:
result = [n for n in range(1000,10000) if n//100%10==3 and n//10%10==6 and n%6==0]

再来看个有趣的数字反转问题:找出所有四位数ABCD,使得ABCD × A = DCBA。我第一次看到这个题目时,花了半小时才想明白怎么拆解数字:

for num in range(1000, 10000): a = num // 1000 b = num // 100 % 10 c = num // 10 % 10 d = num % 10 reversed_num = d*1000 + c*100 + b*10 + a if num * a == reversed_num: print(f"找到满足条件的数字:{num}") # 输出结果:2178

2. 数字特性的验证与发现

Python特别适合验证各种数字猜想。比如这个命题:任何大于9的整数减去各位数字之和,结果必能被9整除。我们可以写个程序来验证:

def validate_rule(n): if n <= 9: return False digit_sum = sum(int(d) for d in str(n)) return (n - digit_sum) % 9 == 0 # 测试10到10000的所有整数 all_valid = all(validate_rule(x) for x in range(10, 10001)) print("命题在所有测试案例中:", "成立" if all_valid else "不成立")

这个例子展示了Python的几个强大特性:

  • 使用生成器表达式int(d) for d in str(n)快速计算数字和
  • all()函数验证所有情况
  • 布尔表达式直接返回验证结果

再来看个更复杂的年龄问题:四个人年龄各不相同,总和129岁,现在和15年前都有三人年龄是平方数。我的解题思路是:

  1. 列出100以内的平方数:[1,4,9,16,25,36,49,64,81,100]
  2. 筛选出大于15的数(因为15年前年龄必须为正)
  3. 检查15年后的数是否仍是平方数
from itertools import combinations squares = [1,4,9,16,25,36,49,64,81,100] current_squares = [s for s in squares if s > 15] valid_ages = [] for ages in combinations(current_squares, 3): fourth = 129 - sum(ages) if (fourth not in ages and fourth > 0 and len({a-15 for a in ages if a>15} & set(squares)) >= 3): valid_ages = list(ages) + [fourth] print("四人年龄:", sorted(valid_ages)) # 输出结果:[16, 25, 36, 52]

3. 数据处理基础实战

列表是Python最常用的数据结构。来看几个实用案例:

案例1:不使用内置函数实现列表统计

def list_stats(data): total = 0 count = 0 max_val = min_val = data[0] if data else None for num in data: total += num count += 1 if num > max_val: max_val = num if num < min_val: min_val = num return { "sum": total, "count": count, "average": total/count if count else 0, "max": max_val, "min": min_val } numbers = [3, 1, 4, 1, 5, 9, 2, 6] print(list_stats(numbers))

案例2:两种高效去重方法对比

方法一:利用集合特性

original = [3,1,4,1,5,9,2,6,5,3] unique = list(set(original)) print(unique) # 顺序可能改变

方法二:保持原始顺序

unique_ordered = [] seen = set() for item in original: if item not in seen: seen.add(item) unique_ordered.append(item) print(unique_ordered) # 保持原顺序

案例3:列表合并的三种方式

list1 = [1,2,3] list2 = [3,4,5] # 方法1:+运算符 combined = list1 + list2 # 方法2:extend方法 list1.extend(list2) # 方法3:解包(Python3.5+) combined = [*list1, *list2]

4. 递归与算法实践

递归是编程中的重要概念。以经典的拿硬币问题为例:每次只能拿1或2个硬币,计算拿完n个硬币有多少种方式。

def coin_ways(n): if n == 1: return 1 elif n == 2: return 2 return coin_ways(n-1) + coin_ways(n-2) # 使用缓存优化(动态规划) from functools import lru_cache @lru_cache(maxsize=None) def coin_ways_optimized(n): if n <= 2: return n return coin_ways_optimized(n-1) + coin_ways_optimized(n-2)

再来看个更复杂的棋盘路径问题:在5x7的棋盘中从左上到右下,只能向右或向下移动,有多少种走法?这实际上是个组合数学问题:

def grid_paths(rows, cols): # 使用动态规划 dp = [[1]*cols for _ in range(rows)] for i in range(1, rows): for j in range(1, cols): dp[i][j] = dp[i-1][j] + dp[i][j-1] return dp[-1][-1] print(f"5x7棋盘路径数:{grid_paths(5,7)}")

这个解法展示了动态规划的典型应用。初始时第一行和第一列都只有1种走法,其他每个位置的走法等于上方和左方位置走法之和。

http://www.jsqmd.com/news/646853/

相关文章:

  • 实验室装修公司推荐 - 资讯焦点
  • 从样本饥荒到零样本泛化:多模态质检如何用1/10标注数据达成99.98%漏检率控制?(2026奇点大会TOP3算法团队内部推演实录)
  • 2026年3月压路机配件源头厂家推荐,靠谱的压路机配件租赁买卖怎么选择优质企业盘点及核心优势详细解读 - 品牌推荐师
  • c++如何将浮点数按指定精度写入文本_setprecision用法【实战】
  • 读懂言外之意,破解模糊困境——如何理解人类意图和模糊指令
  • 数据恢复神器TestDisk PhotoRec:5步快速找回丢失文件与分区
  • detectron2 避坑安装手册:从环境配置到编译成功的全流程解析
  • mysql如何处理索引基数过低情况_mysql索引选择性分析
  • 【SITS2026圆桌权威解码】:多模态大模型商业化落地的5大断层与2024不可错过的3个变现拐点
  • 多模态大模型数据标注流水线设计与优化(附GitHub万星开源Pipeline+标注质量SOP手册)
  • LeagueAkari:基于LCU API的英雄联盟客户端工具套件的模块化架构与实现机制
  • 抖音无水印下载终极指南:免费批量下载视频、音乐和直播的完整方案
  • Cursor Free VIP破解工具2025终极指南:一键绕过试用限制永久免费
  • 2026年柔板印刷机批发厂家口碑推荐,耐用的柔板印刷机实力聚焦技术实力与行业适配性 - 品牌推荐师
  • 从微信视频推荐到电商广告:多任务学习模型MMoE与PLE的实战应用解析
  • 3DGS实战指南:从COLMAP数据准备到模型训练与实时渲染
  • 聚力于内,迎变于外:贵人鸟2026战略大会背后的品牌觉醒 - 资讯焦点
  • MQTT.fx 2040年激活证书全解析:手把手教你安全配置(附避坑指南)
  • 中国企业评价协会:2025中国新经济企业TOP500发展报告
  • 多模态安防监控实战白皮书:2026奇点大会未公开的7个边缘-云协同部署参数(含RTSP+LLM+热力图融合公式)
  • 【仅开放30天】多模态公平性审计工具包V2.1:集成BiasScore™量化引擎、Fairness-Aware Finetuning模块及FDA级可解释性报告生成器
  • 从CMIP6到WRF:手把手教你用AI优化动力降尺度全流程
  • 多模态餐饮推荐算法全栈拆解,覆盖数据对齐、跨模态注意力蒸馏与边缘部署的5大生死关卡
  • 魔兽争霸III增强插件深度指南:解锁游戏性能与操作体验的全面优化方案
  • 机器人运动学控制与滑膜边结构控制的Simulink仿真模型:深入讲解模型原理与滑膜控制学习指南
  • Win11Debloat终极指南:简单三步让Windows 11系统焕然一新
  • 胡桃讲编程|混音教学系列① 第一步:音频素材怎么来?免费 + 简易方法全汇总
  • 好用的待办工具推荐桌面集成智能提醒超方便
  • 别再只调参了!手把手教你用Verilog和PYNQ在FPGA上‘搓’一个YOLOv3-Tiny加速器
  • CSS如何实现Bootstrap响应式间距控制_利用媒体查询设置padding