题目分析

所有个位数为 kk 的正整数,以及 kk 所有的倍数,都被小明称为“kk幸运数”。小明想知道正整数 LLRR 之间(包括 LLRR )所有 kk 幸运数的和,你能帮帮他吗?

小杨有 nn 个正整数,他认为一个正整数是美丽数字当且仅当该正整数是 99 的倍数但不是 88 的倍数。小杨想请你编写一个程序计算 nn 个正整数中美丽数字的数量。

...

从哪些数里选择一些符合条件的出来,这个「哪些数」可能是 NN 次输入,也可能是区间 [L,R][L,R],也可能是区间 [1,N][1, N]


小学阶段只需要掌握:从一组连续的数据中选取「符合条件」的出来即可通过B题。

条件里通常考到:判断一个数是否是另一个数倍数、判断素数等,通常两个条件一起出现。

往上可以涉及到初中数学集合的思想。

第一题集合表示

$$\begin{align} S_k &= \{ x \mid x \in \mathbb{Z}^+, (x \bmod 10 = k) \lor (x \bmod k = 0) \}\\ S_k(L, R) &= \{ x \mid x \in S_k, L \leq x \leq R \} \\ \text{Sum} &= \sum_{x \in S_k(L, R)} x \end{align}$$

第二题集合表示

$$\begin{align} B &= \{ x \in \mathbb{Z}^+ \mid x \bmod 9 = 0 \land x \bmod 8 \neq 0 \}\\ B(S) &= \{ x_i \mid x_i \in S, x_i \in B \} \end{align}$$

通解

以第二题来讲

1.写出条件语句

if (数字 % 9 == 0 && 数字 % 8 != 0) {
}

2.写出数字的范围

for (int i = L; i <= R; i++) {
}

3.组合起来

for (int i = L; i <= R; i++) {
  if (i % 9 == 0 && i % 8 != 0) {
    个数++
  }
}

到这步,核心部分就完成了。

再来一题

1.写出条件语句

if (数字 % 10 == k || 数字 % k == 0) {
  累加
}

2.写出数字的范围

for (int i = L; i <= R; i++) {
}

3.组合起来

for (int i = L; i <= R; i++) {
  if (i % 10 == k || i % k == 0) {
    累加
  }
}