求自乘为8位数且末4位为自身的4位数及Python优雅实现方案
寻找满足条件的4位自守数
嘿,这个问题本质上是在找4位自守数——也就是平方后末尾几位和自身完全相同的数。我准备了两种实现方案,从新手一看就懂的暴力遍历开始,再到更高效的数学解法,保证不同水平的开发者都能理解~
方案一:新手友好的暴力遍历法
这种方法逻辑最直接:遍历所有4位数,逐个检查两个核心条件:
- 该数的平方是8位数(数值范围在10000000到99999999之间)
- 平方数的最后4位等于原数(用取模运算
% 10000就能快速获取最后4位)
代码实现非常简洁:
# 遍历所有4位整数 for num in range(1000, 10000): square = num * num # 同时检查平方位数和末尾匹配条件 if 10000000 <= square <= 99999999 and square % 10000 == num: print(f"找到符合条件的数:{num}")
代码解释
range(1000, 10000):生成所有4位整数(从1000到9999)square % 10000:取平方数的最后4位,这是Python中取模运算的常用小技巧- 两个条件用
and连接,只有同时满足才输出结果
这种方法虽然要遍历9000个数,但对于电脑来说完全是瞬间完成的,新手能快速理解整个逻辑链。
方案二:更高效的数学优化法
如果想避免遍历所有数,我们可以用数论知识简化问题:
题目要求num² ≡ num mod 10000,变形后得到num(num-1) ≡ 0 mod 10000。
因为num和num-1是连续整数,它们互质(没有除1以外的公因数),而10000=16×625,所以必须满足以下两种情况之一:
num是625的倍数,且num ≡ 1 mod 16num是16的倍数,且num ≡ 1 mod 625
我们可以针对这两种情况直接计算符合条件的4位数:
# 情况1:找4位的625倍数,且除以16余1 for k in range(2, 16): # 625×2=1250(最小4位倍数),625×15=9375(最大4位倍数) candidate = 625 * k if candidate % 16 == 1: print(f"找到符合条件的数:{candidate}") # 情况2:找4位的16倍数,且除以625余1 for m in range(63, 625): # 16×63=1008(最小4位倍数),16×624=9984(最大4位倍数) candidate = 16 * m if candidate % 625 == 1: print(f"找到符合条件的数:{candidate}")
代码解释
- 对于情况1:锁定625的4位倍数范围,遍历对应的k值,检查是否满足余数条件
- 对于情况2:锁定16的4位倍数范围,遍历对应的m值,检查是否满足余数条件
运行后会直接得到结果9376——这是唯一符合条件的4位数(另一个理论解是0001,但不属于4位数范围)。
这种方法不需要遍历所有4位数,效率更高,适合处理更大范围的数字问题,也能帮助新手理解一点数论的实际应用。
内容的提问来源于stack exchange,提问作者Aaron Brock
相关产品推荐
相关产品推荐

