酷代码 AI
菜单

给定一个十进制正整数 n n,写下从 1 1 到 n n 的所有整数,然后数一下每个数的各个数位中出现的数字 1 1 的个数。 例如: 当 n = 2 n=2 时,写下 1 , 2 1,2。这样只出现了 1 1 个 1 1; 当 n = 12 n=12 时,写下 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 1,2,3,4,5,6,7,8,9,10,11,12。这样出现了 5 5 个 1 1。 输入格式 一行,一个正整数 n n。 输出格式 一个正整数,即 1 1 的个数。

这是一个经典的数位统计问题。需要统计从 1 到 n 的所有整数中,数字 '1' 在所有数位上出现的总次数。 我们可以使用数位动态规划(Digit DP)或更简洁高效的数学逐位分析法。这里采用高效数学方法:对每一位(个位、十位、百位……)单独计算该位上数字 1 出现的次数。 --- ✅ 核心思路(按位计算) 设当前处理第 i 位(从右往左,0-indexed,即个位是第 0 位),其对应权重为 `base = 10^i`。 将 n 拆分为三部分: - `high = n / (base * 10)` —— 当前位左边的高位部分 - `cur = (n / base) % 10` —— 当前位上的数字 - `low = n % base` —— 当前位右边的低位部分 那么该位上数字 1 出现的次数为: - 若 `cur == 0`:`high * base` - 若 `cur == 1`:`high * base + low + 1` - 若 `cur > 1`:`(high + 1) * base` 遍历所有位(直到 `base <= n`),累加即可。 --- ✅ 示例验证(n = 12) | 位 | base | high | cur | low | 贡献 | |----|------|------|-----|-----|------| | 个位(i=0) | 1 | 12/10 = 1 | (12/1)%10 = 2 | 12%1 = 0 | cur>1 → (1+1)*1 = 2 | | 十位(i=1) | 10 | 12/100 = 0 | (12/10)%10 = 1 | 12%10 = 2 | cur==1 → 0*10 + 2 + 1 = 3 | | 百位+ | 100 > 12 → 停止 | 总计:2 + 3 = 5 ✅ --- ✅ Python 实现 ```python n = int(input().strip()) count = 0 base = 1 while base <= n: high = n // (base * 10) cur = (n // base) % 10 low = n % base if cur == 0: count += high * base elif cur == 1: count += high * base + low + 1 else: count += (high + 1) * base base *= 10 print(count) ``` 输入 `12` 输出 `5`;输入 `2` 输出 `1`;输入 `1` 输出 `1`;输入 `11` 输出 `4`(1,10,11→1+1+2=4)——均正确。 如需 C++/Java 版本可告知。 [2026-02-04 17:20:12 | AI问答 | 695点数解答]

服务商
相关提问
发财导航,免费问AI
实用工具查看更多