完整教程:Python趣味算法:巧解对称数:求车速问题详解
一道有趣的数学问题,带你掌握循环结构与数字分解技巧
看在每天坚持分享有趣知识的份上,点个关注吧(づ ̄ 3 ̄)づ
关注是我更新的动力 ̄︶ ̄∗ ̄︶ ̄∗)
作者会分享更多涉及到各种编程语言的有趣知识!(^∀^●)ノシ
目录
版权声明:本文代码原创部分由CSDN博主「坐路边等朋友」提供,技术解析部分原创,转载请注明出处。
一、问题背景:发现对称数的奥秘
在日常编程学习中,我们经常会遇到一些有趣的数学问题,这些问题不仅能锻炼我们的编程思维,还能帮助我们掌握基本的算法设计技巧。今天我们要解决的"求车速"问题就是这样一个经典案例。
1.1 问题描述:
一辆以固定速度行驶的汽车,司机在上午10点看到里程表上的读数是一个对称数95859(即从左向右读和从右向左读完全一样)。两小时后里程表上出现了一个新的对称数,该数仍为5位数。问该车的速度是多少?新的对称数是多少?
1.2 什么是对称数?
对称数也叫回文数,是指正读反读都一样的数字。比如121、1331、95859等都是对称数。
二、问题分析:从数学到编程的思维转换
2.1 数学建模思路
根据题意,我们可以得出以下关键信息:
起始对称数:95859
时间间隔:2小时
新对称数:5位数且大于95859
车速恒定
我们需要找到大于95859的下一个5位对称数,然后根据时间差计算车速。
2.2 编程解决思路
循环试探:从95860开始逐个检查每个数字
数字分解:将5位数分解为单个数字
对称判断:检查数字是否满足对称条件
结果计算:找到对称数后计算车速
三、算法设计与实现
3.1 核心算法原理
算法的核心在于如何高效地判断一个5位数是否为对称数。我们采用数字分解的方法,将5位数分解为万位、千位、百位、十位和个位,然后比较对称位置上的数字。
3.2 对称条件数学表达:
万位 == 个位 且 千位 == 十位
3.3 完整代码实现
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author : CSDN坐路边等朋友
# @desc: 求车速 - 对称数问题
def find_next_palindrome():
"""
寻找95859之后的下一个5位对称数并计算车速
"""
start_reading = 95859 # 起始里程数
# 方法一:使用for循环
print("=== 方法一:for循环实现 ===")
a = [0, 0, 0, 0, 0] # 列表a用来存放分解后的5个数字
# i为里程数初始值,因最后结果仍是5位数,故最大值为100000
for i in range(95860, 100000):
# 从高到低分解当前i中保存的5位数,并顺次存放在数组元素a[0]~a[4]中
t = 0 # 列表a的下标
k = 100000
while k >= 10:
a[t] = (i % k) // (k // 10) # 保存分解后的数字
k //= 10 # 注意:这里使用整数除法
t += 1
# 判断是否为对称数:a[0]~a[4]分别对应万位到个位
if a[0] == a[4] and a[1] == a[3]:
new_reading = a[0] * 10000 + a[1] * 1000 + a[2] * 100 + a[3] * 10 + a[4]
speed = (new_reading - start_reading) / 2.0
print(f"找到新的对称数: {a[0]}{a[1]}{a[2]}{a[3]}{a[4]}")
print(f"分解后的数字: 万位={a[0]}, 千位={a[1]}, 百位={a[2]}, 十位={a[3]}, 个位={a[4]}")
print(f"对称验证: 万位({a[0]}) == 个位({a[4]}), 千位({a[1]}) == 十位({a[3]})")
print(f"里程增加: {new_reading} - {start_reading} = {new_reading - start_reading} 公里")
print(f"该车的速度为: {speed:.2f} 公里/小时")
return new_reading, speed
def a

浙公网安备 33010602011771号