拆数字的套路

10 分钟

反复做两件事——"取个位(n % 10)"和"去个位(n /= 10)"——就能把一个整数从右往左一位一位拆开,直到 变成 0。拆 123 会依次得到 3、2、1。

int n = 123, sum = 0, digits = 0;
while (n > 0) {
    int d = n % 10;          // 取个位
    sum += d;                // 累加数位和
    digits++;                // 位数计数
    n /= 10;                 // 去个位
}
cout << sum << " " << digits << "\n";  // 输出 6 3

这个套路是很多题的地基:把每次取出的位累加就是数位和;数一共取了几次就是位数;把取出的位反着拼回去就能判回文数、做数字反转。

复杂度是 ,也就是位数,非常快。三个坑:一是循环条件用 while (n > 0),但要单独想想 的情形——若初值就是 0,循环一次都不进,位数和数位和会算成 0,需要特判;二是拆出来的顺序是从低位到高位(先个位),要正序得再反转;三是若还要复用原来的 ,先拿个副本去拆,别把原值改没了。

小纸条

拆 123 会依次得到哪几个数字?

登录 后可看答案

拆数字的套路 · 考级冲刺 · op599 课程