一、题目概述本题是GESP 2023 年 9 月一级认证真题对应洛谷题号 B3864是入门阶段的经典条件筛选与累加求和题核心是根据双重条件筛选数字并计算总和。题目可以简化为输入三个整数k、L、R求区间[L, R]内所有满足以下条件之一的数字之和数字的个位数是 k数字是k 的倍数。注意如果一个数同时满足两个条件比如7既是 7 的倍数个位也是 7只计算一次不重复累加。二、核心考察点这道题覆盖了 GESP 一级的多个高频考点同时锻炼了逻辑判断和去重思维考点考察内容难度循环结构使用for循环遍历区间[L, R]内的所有数字⭐⭐条件判断双重条件筛选个位数判断 倍数判断⭐⭐⭐取模运算%10获取个位数、%k判断倍数⭐⭐变量累加使用变量记录符合条件数字的总和⭐⭐逻辑去重避免同时满足两个条件的数字被重复计算⭐⭐⭐三、解题思路分析1. 核心逻辑拆解要解决这道题我们需要遍历区间[L, R]内的每一个数字i判断i是否满足 “个位数为 k”或“是 k 的倍数”如果满足条件就把i累加到总和变量中遍历结束后输出总和。关键细节用if (条件1 || 条件2)可以天然实现去重因为||逻辑或只会让条件成立的数字被加一次不会重复计算。2. 两个关键条件的实现个位数是 k数字的个位数可以用i % 10获取判断条件为i % 10 k是 k 的倍数判断条件为i % k 0。3. 整体解题流程读取输入的三个整数k、L、R初始化总和变量sum 0用for循环从L遍历到R对每个数字i判断是否满足i % 10 k || i % k 0如果满足sum i循环结束后输出sum。四、易错点提醒考试避坑区间边界错误循环必须从L开始到R结束for (int i L; i R; i)题目要求包括L和R。重复计算问题不能用两个独立的if语句分别判断条件比如先判断个位数再判断倍数都累加否则会导致同时满足两个条件的数字被加两次结果偏大。个位数判断错误个位数是用i % 10不是i / 10后者得到的是十位数及以上的部分。倍数判断的顺序倍数判断是i % k 0不是k % i 0后者逻辑完全颠倒。边界值测试数字同时满足两个条件如样例 1 中的7只计算一次区间内没有符合条件的数字如k7, L8, R13结果为 0区间只有一个数字如LR7结果为 7。五、完整 C 代码#include iostream using namespace std; int main() { int k, L, R; cin k; cin L; cin R; int sum 0; // 初始化总和为0 // 遍历区间[L, R]内的所有数字 for (int i L; i R; i) { // 判断是否满足条件之一个位是k 或 是k的倍数 if (i % 10 k || i % k 0) { sum i; // 符合条件累加到总和 } } cout sum endl; return 0; }六、扩展练习举一反三学会这道题的核心逻辑后可以试试以下扩展练习巩固类似的条件筛选与累加能力练习 1修改条件 —— 双条件同时满足题目变形求区间[L, R]内同时满足“个位数是 k” 和 “是 k 的倍数” 的数字之和。提示把||改成即可。练习 2扩展位数 —— 十位数也是 k题目变形求区间[L, R]内个位数是 k或十位数是 k或是 k 的倍数的数字之和。提示十位数可以用i / 10 % 10获取新增条件(i / 10) % 10 k。练习 3反向筛选 —— 排除特定数字题目变形求区间[L, R]内不满足“个位数是 k” 也不是“k 的倍数” 的数字之和。提示把条件改成!(i % 10 k || i % k 0)或者用连接两个否定条件。练习 4多条件计数 —— 统计幸运数个数题目变形不计算和改为统计区间[L, R]内符合条件的 “幸运数” 有多少个。提示把累加sum i改成计数变量cnt最后输出cnt。练习 5自定义规则 ——“k 的幸运数字” 升级题目变形自定义 “幸运数字” 规则比如规则 A数字包含数字 k如 k7数字 17、71、70 都算规则 B数字是 k 的倍数或者各位数字之和是 k求区间[L, R]内符合规则的数字之和。七、总结这道题的核心是循环遍历 多条件筛选 累加求和是 GESP 一级中非常经典的综合应用题。通过这道题你不仅掌握了取模运算、循环遍历和条件判断还理解了逻辑或||的去重特性这对后续学习更复杂的筛选问题非常有帮助。