取数位

% 运算符用来取数字, / 运算符用来丢掉数字,具体取(丢)多少,看有多少个 0。

例如 1234 % 100,表示取出来后两位, 1234 / 100,表示丢掉后两位。

数学原理

每一个数字都可以拆解成 $a_n \times 10^n + a_{n-1} \times 10^{n-1} + a_{n-2} \times 10^{n-2} + \cdots +a_0 \times 10^0$ 的形式。

例如 1234:

$$1234 = 1 \times 1000 + 2 \times 100 + 3 \times 10 + 4 \times 10^0$$

如果对 1234 / 10:

$$1000 = 100 \times 10 \\ 100 = 10 \times 10\\ 10 = 10$$

可以发现,都是关于 10 的倍数,所以会进入商的部分,而不会进入余数部分,那么千、百、十位上的数字都会进入商,而个位会进入余数部分。

固定取数位

根据数字的范围,确定他的位数个数,例如 10x9910 \le x \le 99,表示 x 一定是两位数,只有十位和个位。

例如 100x999100 \le x \le 999,表示 x 一定是三位数,只有百位、十位和个位。

不固定取数位

不知道数字范围,判定条件更改为:当前这个数字是否变成0.

如果当前数字变成 0,说明这个数字每一个位数都取出来了,已经取干净了。

$$1234 \Rightarrow 123 \Rightarrow 12 \Rightarrow 1 \Rightarrow 0$$

每次做的事情,都是 % 10 取出来当前的个位,再 / 10 丢掉当前的个位,使得高位右移动。

可以使用 while 循环来处理,属于条件判断,根据条件来判定循环是否执行,而不是固定次数循环。

代码模板如下:

while (n != 0) {
  int x = n % 10; // 取出来个位数
  n /= 10; // 丢掉当前个位数
}

变种题型

  1. 确定一个数字的长度,换句话说统计循环执行次数
  2. 统计数位和
  3. 统计某个数字出现了多少次

实质都是模板代码做了简单修改,加入分支结构进行判断。

数学原理没有改变,只是改变了记录的信息。