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

Python大数计算出错:求9+99+…+999(999个9)中1的个数

问题分析

题目要求计算 ( N = 9 + 99 + 999 + \dots + \underbrace{999\cdots999}_{999个9} ) 中数字1的个数,数学推导的正确结果是998个1,但你的代码输出了999个1,长度为1000。

错误原因

你的代码逻辑本身是正确的,但如果实际运行时误将 10**i - 1 写成了 10**i,就会得到总和为 ( 10 + 100 + 1000 + \dots + 10^{999} ),这个数是 111...1110(999个1加末尾1个0),统计1的个数就是999,和你描述的错误结果完全匹配。另外,循环累加大整数虽然可行,但效率较低,且容易出现笔误。

修正后的代码

方式1:修正循环逻辑(确保正确累加每一项)

N = 0
nr_of_ones = 0
# 循环范围1到999,对应1个9到999个9的数,共999项
for i in range(1, 1000):
    N += 10**i - 1  # 确保这里是10**i -1,不是10**i
N_str = str(N)
print("N =", N_str)
print("Length of N =", len(N_str))
# 统计1的个数
nr_of_ones = N_str.count('1')
print(nr_of_ones)

方式2:用数学公式直接计算(高效且避免循环错误)

根据求和公式:
[
\sum_{k=1}^{n} (10^k - 1) = \frac{10(10^n - 1)}{9} - n = \frac{10^{n+1} - 10 - 9n}{9}
]
其中 ( n=999 ),代入公式直接计算:

n = 999
# 计算10+100+...+10^999的和
sum_10k = (10 ** (n + 1) - 10) // 9
# 减去999(因为每一项都减了1,共999项)
N = sum_10k - n
N_str = str(N)
print("N =", N_str)
print("Length of N =", len(N_str))
print("Number of 1s:", N_str.count('1'))

验证小例子

比如计算 ( 9+99+999=1107 ),用上述代码运行会得到1的个数为2,符合 ( 3-1=2 ) 的规律,验证了代码的正确性。

内容的提问来源于stack exchange,提问作者obvRoot obvRoot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 23:42:09