洛谷 B4007 / B4411 / B4035 计数、优美的数字与美丽数字——余数与数学之美
📌 摘要
B4007 统计数字 k 在 1 到 n 中出现的次数,B4411 统计所有位都相同的数的个数,B4035 统计是 9 的倍数但不是 8 的倍数的数的个数。三道题共享两个核心操作:逐位拆解(%10取个位、/10去个位)和取余判断(%k == 0判断整除)。很多同学在做这些题时第一次真正理解了余数——当被除数小于除数时,余数等于被除数本身,而不是 0。三道题的名称——计数、优美、美丽——都在邀请我们从人文角度欣赏数学。本文从伪代码题解出发,延伸到余数的数学本质、9 的数位和整除规则、重码数(Repdigit)的数论性质,以及从毕达哥拉斯到 Erdős 的"数学美"传统。
题目链接:B4007 计数 | B4411 优美的数字 | B4035 美丽数字
📚 目录
📝 前言
🔍 三道题在考什么
🔢 B4007:计数
💡 思路
📝 伪代码
🎯 关键点
✨ B4411:优美的数字
💡 思路
📝 伪代码
🎯 关键点
💎 B4035:美丽数字
💡 思路
📝 伪代码
🎯 关键点
⚖️ 三题对比
⚠️ 注意事项
🌳 延伸:数学之美——从余数到数论
🔢 余数的本质:被除数小于除数时
✨ 9 的魔力:数位和与整除规则
🔄 重码数(Repdigit):所有位相同的数
🎭 数学美:从毕达哥拉斯到 Erdős
🎪 三道题的数学内核
📚 延伸阅读文献
📝 前言
这篇题解没有源代码,只有伪代码。
作为一名信奥教练,我不提倡复制粘贴。我见过太多学生搜到题解、复制、粘贴、提交、AC——代码跑通了,脑子没跑通。下次遇到变体题,还是不会。
伪代码剥掉了语言的壳,只留算法的骨架。你看不到#include,看不到cin、cout,看不到那些让你以为"我会了"的语法细节。你能看到的只有:这一步做什么、下一步做什么、为什么这么做。
如果你是路过的友友,已经在这道题上挣扎了很久——先去喝杯水,回来重新看看自己卡在哪一步。是没读懂题意?是思路方向偏了?还是代码有 bug 但逻辑其实对?大多数时候不是不会,是走偏了。偏了不可怕,可怕的是偏了之后直接放弃,去抄一份能 AC 的代码。抄完你以为你懂了,其实你只是搬了别人的结论。
除非你时间真的紧张——比赛临近、作业要交——那种情况先 AC 再说,能理解。但平时练习,给自己一点耐心。先自己想、自己写、自己调,跑不过了再来看伪代码:你的思路和这里差在哪一步。那一步,就是你真正学到的东西。
🔍 三道题在考什么
三道题都是"对数字做某种判断然后计数",但判断的依据截然不同:
| B4007 计数 | B4411 优美的数字 | B4035 美丽数字 | |
|---|---|---|---|
| 判断什么 | 某个数字 k 出现了几次 | 所有位是否都相同 | 是 9 的倍数但不是 8 的倍数 |
| 核心操作 | 逐位拆解 + 比较 | 逐位拆解 + 一致性检查 | 取余判断整除性 |
| 数学概念 | 数字频率 | 重码数(Repdigit) | 整除与互斥条件 |
| 难度 | 入门 | 入门 | 入门 |
B4007 把每个数的各位拆开,数某个数字出现了几次。B4411 把每个数的各位拆开,检查它们是否全相同。B4035 不拆数字,直接用取余判断整除性。前两题是"逐位操作",第三题是"整体取余"。
三道题的名称——计数、优美、美丽——都不约而同地用了审美词汇。这不偶然:数学家和数学教育者一直认为,数学的美感应该被体验,而不仅仅是被计算。
🔢 B4007:计数
💡 B4007 思路
遍历 1 到 n 的每个数,对每个数用%10取个位、/10去个位,逐位检查是否等于 k,累加计数。
📝 B4007 伪代码
读取 n, k 计数 = 0 对 i = 1 到 n: temp = i 当 temp > 0: 如果 temp % 10 == k: // 取个位 计数++ temp = temp / 10 // 去掉个位 输出 计数🎯 B4007 关键点
逐位拆解。%10取个位,/10去个位,循环直到数为 0。这是数字位操作的基础。
用样例 n=25, k=2 追踪:
| 数 | 各位 | 含 2 的个数 | 累计 |
|---|---|---|---|
| 1 | 1 | 0 | 0 |
| 2 | 2 | 1 | 1 |
| 3~11 | — | 0 | 1 |
| 12 | 1, 2 | 1 | 2 |
| 13~19 | — | 0 | 2 |
| 20 | 2, 0 | 1 | 3 |
| 21 | 2, 1 | 1 | 4 |
| 22 | 2, 2 | 2 | 6 |
| 23 | 2, 3 | 1 | 7 |
| 24 | 2, 4 | 1 | 8 |
| 25 | 2, 5 | 1 | 9 |
输出:9。
22 贡献了 2 次。数字 22 的十位和个位都是 2,所以%10检查个位(==2,计数++),/10后变成 2,再%10检查(==2,计数++),总共 2 次。逐位拆解自然地处理了"同一个数中多次出现"的情况。
✨ B4411:优美的数字
💡 B4411 思路
遍历 1 到 n 的每个数,取个位作为"参考数字",然后逐位检查所有位是否都等于参考数字。如果全部相同,就是"优美的"。
代码取i % 10(个位)作为参考single_num,然后从个位开始逐位检查。如果任何一位不等于single_num,立刻break。如果temp == 0(所有位都检查过且都相同),则计数。
📝 B4411 伪代码
读取 n 总数 = 0 对 i = 1 到 n: temp = i 参考数字 = i % 10 // 取个位作为参考 当 temp > 0: 当前位 = temp % 10 如果 当前位 != 参考数字: 跳出循环 // 发现不同,不优美 temp = temp / 10 如果 temp == 0: // 所有位都检查过,全相同 总数++ 输出 总数🎯 B4411 关键点
"全相同"的判断技巧。取一个位作为参考,逐位比对。如果中途发现不同就 break,temp 不为 0;如果全部相同,循环正常结束,temp 变为 0。用temp == 0作为"全相同"的标志。
用样例 n=6 追踪:
| 数 | 各位 | 参考数字 | 全相同? | 累计 |
|---|---|---|---|---|
| 1 | 1 | 1 | ✓ | 1 |
| 2 | 2 | 2 | ✓ | 2 |
| 3 | 3 | 3 | ✓ | 3 |
| 4 | 4 | 4 | ✓ | 4 |
| 5 | 5 | 5 | ✓ | 5 |
| 6 | 6 | 6 | ✓ | 6 |
输出:6。1-6 都是一位数,自然"全相同"。
n=2025 的情况。1-9 是 9 个,11-99 是 9 个,111-999 是 9 个,1111 是 1 个(2222 > 2025 不算)。9+9+9+1=28。
这些数叫什么?所有位都相同的数,在数论中叫重码数(Repdigit,Repeated Digit)(Repdigit — Wikipedia)。1, 2, …, 9, 11, 22, …, 99, 111, 222, …, 999, 1111, … — 每个位都是同一个数字的重复。延伸部分会展开讲。
💎 B4035:美丽数字
💡 B4035 思路
读入 n 个数,对每个数检查两个条件:是 9 的倍数(%9 == 0)且不是 8 的倍数(%8 != 0)。两个条件都满足才算"美丽"。
📝 B4035 伪代码
读取 n 美丽数计数 = 0 对 i = 1 到 n: 读取 temp 如果 temp % 9 == 0 且 temp % 8 != 0: 美丽数计数++ 输出 美丽数计数🎯 B4035 关键点
取余判断整除。a % b == 0意味着 a 能被 b 整除。a % b != 0意味着不能。两个条件用"且"连接——必须同时满足。
用样例[1, 9, 72]追踪:
| 数 | %9 == 0? | %8 != 0? | 美丽? |
|---|---|---|---|
| 1 | 1%9=1≠0 → 否 | — | 否 |
| 9 | 9%9=0 → 是 | 9%8=1≠0 → 是 | 是 |
| 72 | 72%9=0 → 是 | 72%8=0 → 否 | 否 |
输出:1。
72 为什么不美丽?72 是 9 的倍数(8×9=72),但也是 8 的倍数(9×8=72)。题目要求"是 9 的倍数但不是8 的倍数"——两个条件缺一不可。
"被除数 < 除数"时的余数。很多同学在这里第一次真正理解了余数。比如 1 % 8 等于多少?直觉上"8 除不尽 1",但余数不是 0——是 1。因为 1 ÷ 8 = 0 余 1。当被除数小于除数时,商为 0,余数等于被除数本身。这个看似简单的概念,是整除判断的基础。
⚖️ 三题对比
| B4007 计数 | B4411 优美的数字 | B4035 美丽数字 | |
|---|---|---|---|
| 操作对象 | 数字的一位 | 数字的每一位 | 整个数字 |
| 核心操作 | %10+/10逐位拆解 | %10取参考 + 逐位比对 | %9和%8整除判断 |
| 计数条件 | 某位 == k | 所有位 == 参考位 | 是 9 倍数且非 8 倍数 |
| 数学概念 | 数字频率 | 重码数(Repdigit) | 整除性与互斥条件 |
| "美"在哪 | 数字出现在多少个数里 | 所有位和谐统一 | 恰好满足双重条件 |
| 复杂度 | O(n × d) | O(n × d) | O(n) |
B4007 和 B4411 都在"逐位拆解"——把一个多位数拆成一位一位的。B4035 不拆,直接对整个数取余。前两题是"微观"操作(看每一位),第三题是"宏观"操作(看整个数)。
⚠️ 注意事项
余数基础:被除数 < 除数时余数 = 被除数:这是很多同学的第一个"原来如此"时刻。
1 % 8 = 1(不是 0),3 % 9 = 3(不是 0),7 % 8 = 7(不是 0)。因为 1 ÷ 8 = 0 余 1。a % b == 0只有在 a 是 b 的倍数(或 a==0)时才成立。当 a < b 且 a > 0 时,a % b = a ≠ 0,所以 a 不是 b 的倍数——这是正确的。B4007 的 22 贡献两次:逐位拆解会自然地把 22 拆成两个 2,各检查一次。不需要特殊处理"同一个数中多次出现"的情况。
B4411 的
temp == 0判断:循环正常结束(所有位都相同)时 temp 变为 0;中途 break(发现不同)时 temp 不为 0。用temp == 0作为"全相同"的标志是一种简洁的写法,但可读性见仁见智——更直观的写法是单独设一个all_same布尔标志。B4035 的"且"逻辑:
%9 == 0 && %8 != 0两个条件必须同时满足。如果用||(或),72 也会被判为美丽(因为 72%9==0 成立),这是错的。B4035 的数据范围:n, a_i ≤ 10⁵,O(n) 遍历即可,无需优化。
🌳 延伸:数学之美——从余数到数论
你说这三道题的名称——计数、优美、美丽——“似乎都在让大家从人文角度去欣赏数学的魅力”。没错,而且这个传统从 2500 年前就开始了。
🔢 余数的本质:被除数小于除数时
很多同学做 B4035 时第一次碰到了这个问题:1 % 8等于多少?
直觉说"8 除不尽 1",有人猜 0(除不尽就是 0 余数),有人猜 -7(差 7 才到 8)。但答案是1。
因为除法的定义是:被除数 = 商 × 除数 + 余数,其中 0 ≤ 余数 < 除数。
1 = 0 × 8 + 1 → 商=0, 余数=1 3 = 0 × 9 + 3 → 商=0, 余数=3 7 = 0 × 8 + 7 → 商=0, 余数=7当被除数 < 除数时,商为 0,余数 = 被除数本身。这不是特殊规则,是除法定义的直接推论。
| 表达式 | 商 | 余数 | 含义 |
|---|---|---|---|
| 17 % 5 | 3 | 2 | 17 里有 3 个 5,剩 2 |
| 8 % 8 | 1 | 0 | 8 里有 1 个 5,不剩 → 整除 |
| 3 % 8 | 0 | 3 | 3 里没有 8,剩 3 |
| 1 % 9 | 0 | 1 | 1 里没有 9,剩 1 |
余数 ≠ 0 意味着"不整除"。当 a < b 且 a > 0 时,a % b = a ≠ 0,所以 a 不是 b 的倍数。这是 B4035 中%8 != 0判断的逻辑基础。
这个概念在数学中叫模运算(Modular Arithmetic),是数论的基础工具。高斯在 1801 年的《算术研究》中系统化地建立了模运算理论,从此它成了现代密码学(RSA)、计算机科学(哈希函数)、竞争编程(数论题)的共同语言。
✨ 9 的魔力:数位和与整除规则
B4035 判断"9 的倍数",B4007 和 B4411 都在"逐位拆解数字"。这两件事之间有一个深刻的数学联系:
一个数能被 9 整除,当且仅当它的各位数字之和能被 9 整除。(The Magic of Numbers — Utah Math Circle)(20 Cool Math Facts — CueMath)
为什么?因为10 ≡ 1 (mod 9)——10 除以 9 余 1。所以 10 的任何次方除以 9 都余 1:
10 = 9×1 + 1 → 10 ≡ 1 (mod 9) 100 = 9×11 + 1 → 100 ≡ 1 (mod 9) 1000 = 9×111 + 1 → 1000 ≡ 1 (mod 9)所以一个数比如 576 = 5×100 + 7×10 + 6×1,对 9 取余:
576 mod 9 = (5×1 + 7×1 + 6×1) mod 9 = (5+7+6) mod 9 = 18 mod 9 = 0576 的各位数字之和 5+7+6=18,18 是 9 的倍数,所以 576 是 9 的倍数。(Base-b Digit Sum Function)(特殊数学性质 — CSDN)
这意味着:B4007 的"逐位拆解"和B4035 的"取余判断整除"在数学上是连通的——逐位拆解数字求和,就等价于对 9 取余。你在 B4007 里数 2 出现了几次,和判断一个数是不是 9 的倍数,用的是同一套"位值"数学。
| 整除规则 | 原理 | 和三道题的关系 |
|---|---|---|
| 能被 9 整除 ↔ 各位之和能被 9 整除 | 10 ≡ 1 (mod 9) | B4035 判断 9 的倍数 |
| 能被 3 整除 ↔ 各位之和能被 3 整除 | 10 ≡ 1 (mod 3) | 同理 |
| 能被 2 整除 ↔ 末位是偶数 | 10 ≡ 0 (mod 2) | — |
| 能被 5 整除 ↔ 末位是 0 或 5 | 10 ≡ 0 (mod 5) | — |
9 的整除规则之所以特别,是因为 10 ≡ 1 (mod 9)——每一位的"权重"都是 1,所以各位直接相加就行。这就是为什么 9 在整除规则中独树一帜。
🔄 重码数(Repdigit):所有位相同的数
B4411 的"优美数字"——所有位都相同的数——在数论中有一个正式名字:重码数(Repdigit,Repeated Digit)(Repdigit — Wikipedia)。
重码数的序列是:1, 2, 3, …, 9, 11, 22, 33, …, 99, 111, 222, …, 999, 1111, …
一个 d 位的重码数可以写成:
R(d, r) = r × (10^d - 1) / 9 其中 d 是位数,r 是重复的数字(1-9)比如 222 = 2 × (10³ - 1)/9 = 2 × 999/9 = 2 × 111 = 222。
重码数有一些有趣的数论性质(Repdigit and Repunit — Research):
| 性质 | 例子 | 说明 |
|---|---|---|
| 全由 1 组成的重码数叫重一数(Repunit) | 1, 11, 111, 1111, … | “Repeated Unit”,1966 年命名(Repunit — Wikipedia) |
| 重码数要为质数,必须是重一数且位数为质数 | 11 是质数(2 位,2 是质数) | 22 = 2×11 不是质数 |
| 不是所有质数位的重一数都是质数 | 111 = 3×37 不是质数(3 位,3 是质数但 111 不质) | 位数为质数是必要非充分条件 |
| 重码数的数字和 = 位数 × 重复数字 | 222 的数字和 = 3×2 = 6 | 和 9 的整除规则联动 |
B4411 答案的数学公式。不超过 n 的重码数个数可以算出来:对每个位数 d(1 到 n 的位数),每个重复数字 r(1 到 9),如果 R(d,r) ≤ n 就算一个。n=2025 时:1 位 9 个 + 2 位 9 个 + 3 位 9 个 + 4 位只有 1111 ≤ 2025 一个 =28。你不用遍历 1 到 2025 每个数,直接枚举位数和重复数字就能算出来——从 O(n) 优化到 O(9 × log n)。
🎭 数学美:从毕达哥拉斯到 Erdős
三道题的名称——计数、优美、美丽——用了审美词汇。这不是偶然。数学家和数学教育者一直相信,数学的美感应该被体验,而不仅仅是被计算。
| 人物 | 时代 | 名言/观点 |
|---|---|---|
| 毕达哥拉斯 | 公元前 500 年 | “万物皆数”(All is number)——第一个把数学和美等同的人 |
| 柏拉图 | 公元前 400 年 | “不懂几何者不得入内”——数学是理解真理的前提 |
| 欧拉 | 18 世纪 | e^(iπ)+1=0——被公认为"最美丽的数学公式" |
| 哈代 | 20 世纪 | “数学家的模式如画家或诗人一样,必须是美的”(A Mathematician’s Apology) |
| Erdős | 20 世纪 | “上帝有一本证明之书,里面收录了每个定理最优美的证明” |
哈代在《一个数学家的辩白》中写道:" Beauty is the first test: there is no permanent place in the world for ugly mathematics."(美是第一道考验:丑陋的数学在世界上没有永久的位置。)——他说的不只是大定理,也包括你今天写的每一行代码里的数学逻辑。
B4411 的"优美数字"——所有位都相同——是一种对称美。B4035 的"美丽数字"——恰好满足两个条件——是一种平衡美。B4007 的"计数"——数字在序列中出现多少次——是一种规律美。三种美,恰好对应数学审美的三个维度。
🎪 三道题的数学内核
| 题 | 表面是 | 数学本质是 | 美在哪 |
|---|---|---|---|
| B4007 计数 | 数数字 k 出现几次 | 位值制——10^k 的权重 | 规律美:数字在序列中的频率 |
| B4411 优美的数字 | 所有位是否相同 | 重码数——r×(10^d-1)/9 | 对称美:重复与统一 |
| B4035 美丽数字 | 是 9 倍数非 8 倍数 | 模运算——10 ≡ 1 (mod 9) | 平衡美:双重条件的精确交集 |
三道题共享的数学基础是位值制(Place Value System)——一个数的值取决于每个数字在哪个位置。B4007 利用位值制把数字拆开,B4411 利用位值制检查一致性,B4035 的 9 整除规则本身就是位值制的数学推论。
位值制是人类发明的最伟大的数学技术之一。没有它,我们还在用罗马数字做加减法——MCMXCIV + CCLXVII = ? 有了位值制,同样的运算是 1994 + 267 = 2261——逐位计算,进位即可。你在三道题里用的%10和/10,就是在利用位值制——每一位的权重是 10 的幂。
📚 延伸阅读文献
论文
- A. H. Beiler.Recreations in the Theory of Numbers. Dover, 1966. (Repunit — Wikipedia) —— "Repunit"一词的起源,重码数与重一数的数论入门。
- P. Patel et al.Patterns obtained from digit and iterative digit sums of Palindromic, Repdigit and Repunit numbers. Global Journal of Pure and Applied Mathematics, 2016. (Research Publication) —— 重码数与重一数的数字和模式研究。
- C. F. Gauss.Disquisitiones Arithmeticae(算术研究). 1801. —— 模运算理论的奠基之作,数论的经典。
在线资源
- 洛谷.B4007 [GESP202406 二级] 计数. https://www.luogu.com.cn/problem/B4007
- 洛谷.B4411 [GESP202509 二级] 优美的数字. https://www.luogu.com.cn/problem/B4411
- 洛谷.B4035 [GESP202409 一级] 美丽数字. https://www.luogu.com.cn/problem/B4035
- The Magic of Numbers — Utah Math Circle. https://www2.math.utah.edu/mathcircle/notes/magicnumbers.pdf —— 9 的整除规则证明,含位值制与模运算。
- 20 Cool Math Facts That Will Change the Way You See Numbers — CueMath. https://www.cuemath.com/blog/20-cool-math-facts/ —— 数学趣味知识,含 9 的数字和自检。
- The Base-b Digit Sum Function — Jupiter Science. https://jupiterscience.com/… —— 位值制与整除规则的数学原理。
- Repdigit — HandWiki. (Wikipedia) —— 重码数百科条目,含数论性质。
- Repunit — Wikipedia. (Wikipedia) —— 重一数百科条目,含质数判定。
- 特殊的数学性质 — CSDN. https://blog.csdn.net/ke_wu/article/details/144300038 —— 数模 9 等于各位数之和模 9 的中文解释。
推荐教材
G. H. Hardy.A Mathematician’s Apology. Cambridge University Press, 1940. —— 哈代关于数学美的经典论述,“丑陋的数学没有永久位置”。
I. Niven.Numbers: Rational and Irrational. MAA, 1961. —— 数论入门经典,含整除性与模运算。
A. H. Beiler.Recreations in the Theory of Numbers. Dover, 1966. —— 数论趣味读物,重码数与重一数的全面介绍。
M. Du Sautoy.The Music of the Primes. HarperCollins, 2003. —— 从质数分布到数学美,通俗数学读物。
本文标签:#算法 #数论 #余数 #整除规则 #重码数 #位值制 #数学美 #洛谷题解 #信奥 #C++ #入门
本文首发于CSDN,作者:HugoStudio_SWAN