拆数字的套路
约 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 会依次得到哪几个数字?
登录 后可看答案