拆分整数的各位数

拆分整数的各位数#

拆分整数的核心在于, 十进制的表示方式是 \(d_0 * 10^0 + d_1 * 10^1 + ... + d_n * 10^n\), 因此,

  • 利用整数求余 % 运算, 我们可以 "筛" 掉高位部分: 2193 % 100 == 93.

  • 利用整数整除 / 运算, 我们可以 "筛" 掉低位部分: 2193 / 100 == 21.

这是不是意味着我们要用 2193 % 10的n次方 / 10的n-1次方 这样的方式来得到各个位? 不需要这么复杂. 我们可以每次循环时, 将 int value = 2193 除以 10.

1int value = 2193
2value     /= 10;  // 219 (value /= 10 相当于 value = value / 10)
3value     /= 10;  // 21
4value     /= 10;  // 2
5value     /= 10;  // 0

这样一来, 我们就能用 value % 10 得到各个位: [在线代码 s7Yx7sz3P]

 1#include <iostream>
 2using namespace std;
 3
 4int main() {
 5  int value;
 6  cin >> value;
 7
 8  for (; value != 0; value /= 10) {
 9    int digit = value % 10;
10    // 用当前位的数 digit 做任何你需要的事
11  }
12}
  • 如果你需要保留 value 不变呢? for (int i = value; i != 0; i /= 10).

  • 如果输入的 value0 呢? 那就需要你另外考虑了.

例如, 我们可以对整数的各个位数进行求和:

 1#include <iostream>
 2using namespace std;
 3
 4int main() {
 5  int value;
 6  cin >> value;
 7
 8  int sum_of_digits = 0;
 9  for (; value != 0; value /= 10) {
10    int digit      = value % 10;
11    sum_of_digits += digit;
12  }
13}

不知道为什么新手会想到的复杂方法#

对于第 n 位 (第 1 位为个位, 第 2 位为十位...), 我们可以用 2193 % 10的n次方 / 10的n-1次方 得到.

为此, 我们需要使用 #include <cmath> 里的 std::pow 函数来求幂: std::pow(10, 2) == 100.0. (由于 using namespace std;, 使用时 std:: 可以省略.)

但是, 请注意 std::pow 返回的结果是浮点数, 整数不能和浮点数进行求幂运算 (你怎么求 2193 除以 1.5 的余数?). 因此, 我们要用 static_cast<int>(std::pow(10, 2)) 将结果转换为 int 类型: [在线代码 8j3E43MPY]

 1#include <cmath>  // for std::pow
 2#include <iostream>
 3using namespace std;
 4
 5int main() {
 6  int value = 0;
 7  cin >> value;
 8
 9  int digit_size = 0;
10  for (int i = value; i != 0; i /= 10) {
11    ++digit_size;
12  }
13
14  for (int i = 0; i < digit_size; ++i) {
15    int digit =
16        value % static_cast<int>(pow(10, i + 1)) / static_cast<int>(pow(10, i));
17    // 用当前位的数 digit 做任何你需要的事
18  }
19}