【写在前面】可以参看我的视频学,如果喜欢,关注,点赞,转发在数据处理、算法练习或日常开发中,获取数字的每一位是非常常见的需求。本文将通过 4 种实用方法,带你彻底掌握这个技巧。
方法一:数学运算法(取模+整除)
这是最经典的算法思路,通过 取模运算 % 获取末位,整除 // 去掉末位。
步骤演示:获取数字 1234 的每一位
num=1234
whilenum>0:
digit=num%10# 步骤1:取模获取最后一位
print(f"当前位: {digit}")
num=num//10# 步骤2:整除去掉最后一位
# 输出结果:
# 当前位: 4
# 当前位: 3
# 当前位: 2
# 当前位: 1
进阶:保存到列表(从低位到高位)
defget_digits_math(n):
"""通过数学运算获取每一位,返回列表(个位在前)"""
digits= []
whilen>0:
digits.append(n%10)
n//=10
returndigits
# 测试
number=5678
result=get_digits_math(number)
print(f"数字 {number} 的每一位:{result}")
# 输出:[8, 7, 6, 5]
⚠️ 注意:此方法获取的顺序是从低位到高位(个位→十位→百位...)
方法二:字符串转换法(最简洁)
将数字转为字符串,直接遍历每个字符,再转回整数。
步骤演示
defget_digits_string(n):
"""字符串法获取每一位,返回列表(高位在前)"""
# 步骤1:转为字符串 → 步骤2:遍历每个字符 → 步骤3:转回整数
return [int(char) forcharinstr(n)]
# 测试
number=5678
result=get_digits_string(number)
print(f"数字 {number} 的每一位:{result}")
# 输出:[5, 6, 7, 8]
特点对比
| 特性 | 数学运算法 | 字符串法 |
|---|
| 代码长度 | 稍长 | 极简 |
| 执行效率 | 更快(纯数学运算) | 稍慢(类型转换开销) |
| 返回顺序 | 低位→高位 | 高位→低位 |
| 适用场景 | 算法竞赛、大数据量 | 日常开发、快速原型 |
方法三:指定位置获取(如获取百位数)
有时我们只需要特定位置的数字,比如获取千位或百位。
defget_digit_at_position(n, position):
"""
获取数字 n 的第 position 位(从右数,个位是1)
例如:get_digit_at_position(1234, 3) 返回 2(百位)
"""
for_inrange(position-1):
n//=10
returnn%10
# 实战示例:分别获取个、十、百、千位
number=1234
print(f"个位:{get_digit_at_position(number, 1)}") # 4
print(f"十位:{get_digit_at_position(number, 2)}") # 3
print(f"百位:{get_digit_at_position(number, 3)}") # 2
print(f"千位:{get_digit_at_position(number, 4)}") # 1
方法四:递归法(算法思维训练)
适合理解递归思想,面试常考。
defget_digits_recursive(n):
"""递归获取每一位,返回列表(高位在前)"""
ifn<10:
return [n]
# 先获取前面所有位,最后加上当前末位
returnget_digits_recursive(n//10) + [n%10]
# 测试
number=5678
result=get_digits_recursive(number)
print(f"数字 {number} 的每一位:{result}")
# 输出:[5, 6, 7, 8]
综合实战:水仙花数判断
水仙花数:一个 n 位数,其各位数字的 n 次幂之和等于它本身。例如:153 = 1³ + 5³ + 3³
defis_narcissistic(num):
"""判断是否为水仙花数"""
digits=get_digits_string(num) # 获取每一位
n=len(digits) # 位数
total=sum(d**nfordindigits) # 每位数的n次幂之和
returntotal==num
# 测试
test_numbers= [153, 370, 371, 407, 123]
fornumintest_numbers:
result="是水仙花数 ✅"ifis_narcissistic(num) else"不是水仙花数 ❌"
print(f"{num}{result}")
# 输出:
# 153 是水仙花数 ✅
# 370 是水仙花数 ✅
# 371 是水仙花数 ✅
# 407 是水仙花数 ✅
# 123 不是水仙花数 ❌
总结速查表
| 需求场景 | 推荐方法 | 核心代码 |
|---|
| 快速获取所有位 | 字符串法 | [int(c) for c in str(n)] |
| 高性能/大数据量 | 数学运算法 | while n>0: n%10; n//=10 |
| 获取指定位数 | 位置定位法 | 循环 //=10 后 %10 |
| 算法面试/递归思维 | 递归法 | 递归 n//10 + [n%10] |
练习题
基础:编写函数,计算一个数字的各位之和。
进阶:找出 1-1000 中的所有水仙花数。
挑战:反转一个整数(如 123 → 321),注意处理负数。