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
相关产品推荐
相关产品推荐

