You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求自乘为8位数且末4位为自身的4位数及Python优雅实现方案

寻找满足条件的4位自守数

嘿,这个问题本质上是在找4位自守数——也就是平方后末尾几位和自身完全相同的数。我准备了两种实现方案,从新手一看就懂的暴力遍历开始,再到更高效的数学解法,保证不同水平的开发者都能理解~

方案一:新手友好的暴力遍历法

这种方法逻辑最直接:遍历所有4位数,逐个检查两个核心条件:

  1. 该数的平方是8位数(数值范围在10000000到99999999之间)
  2. 平方数的最后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,所以必须满足以下两种情况之一:

  1. num是625的倍数,且num ≡ 1 mod 16
  2. num是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:05:41