拆分整数的各位数#
拆分整数的核心在于, 十进制的表示方式是 \(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)
.如果输入的
value
是0
呢? 那就需要你另外考虑了.
例如, 我们可以对整数的各个位数进行求和:
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}