本题要求计算在区间 ([L, R]) 内所有“k 幸运数”的和。
根据题意,“k 幸运数”定义为满足以下任意一个条件的正整数:
需要注意,当一个数同时满足两个条件时,它仍然是同一个幸运数,只加一次即可。
数据范围很小:(k \le 9),(L, R \le 1000),所以直接枚举检查每个数完全可行。
我们可以遍历区间 ([L, R]) 中的每一个整数 (n),判断它是否为幸运数。判断条件可以直接按照定义写出:
如果两个条件中至少有一个成立,就把 (n) 累加到答案中。最后输出总和。
这种方法思路直接,代码量小,非常适合初学者理解。
采用模拟法,即模拟题目描述的过程。具体步骤如下:
sum = 0;n 从 (L) 到 (R):
n % 10 == k 或 n % k == 0,则 sum += n;sum。循环次数为 (R - L + 1),最大不超过 (1000)。
每次循环内只进行常数次基本运算(取模、比较、加法),因此整体时间复杂度为 (O(R-L+1)),可以在 (1\text{ms}) 内轻松运行完毕。
空间复杂度为 (O(1)),只使用了几个变量。
题目已给出 C++ 参考代码,下面进行详细解释。
cpp1#include <iostream> 2using namespace std; 3 4int main() { 5 int k = 0, L = 0, R = 0, sum = 0; 6 cin >> k >> L >> R; // 读入 k、区间左端点 L、右端点 R 7 for (int n = L; n <= R; n++) // 枚举 [L, R] 中的每一个整数 n 8 if (n % 10 == k || n % k == 0) // 个位是 k 或 是 k 的倍数 9 sum += n; // 满足条件则累加 10 cout << sum << endl; // 输出总和 11 return 0; 12}
关键点解释:
n % 10 可以取出整数 (n) 的个位数字。n % k == 0 表示 (n) 能被 (k) 整除,即 (n) 是 (k) 的倍数。||(逻辑或)连接两个条件,只要有一个为真,当前数就被视为幸运数。此代码简洁明了,直接体现了题目要求。