B4344 [语言月赛 202506] 数字转转转 题解
Source & Knowledge
2025 年 6 月语言月赛,由洛谷网校入门计划/基础计划提供。
题目大意
给定一个正整数
题目分析
对于每个数字
计算各位数字之和的方法:
int sum = 0;
while (num > 0) {
sum += num % 10; // 取出个位数字
num /= 10; // 去掉个位数字
}
return sum;
将这个逻辑应用到题目中:
// 对于从1到n的每个数字i
for (int i = 1; i <= n; ++i) {
int cnt; // 当前数字i需要进行的转转转次数
cin >> cnt;
int x = i; // 初始值为i
// 进行转转转操作,最多cnt次,但只要x变为个位数就停止
for (int j = 1; j <= cnt; ++j) {
int sum = 0;
// 计算x的各位数字之和
while (x > 0) {
sum += x % 10;
x /= 10;
}
x = sum; // 更新x为各位数字之和
if (x < 10) { // 如果x已经是小于10的个位数,则后续操作结果不变
break; // 跳出内层循环
}
}
cout << x << " "; // 输出最终结果
}
代码中有一个 if (x < 10) { break; },现对其作一个直观解释。
由于“数字转转转”操作的最终结果是一个个位数,并且一旦达到个位数,后续操作结果不变,这意味着我们不需要真正执行
题目中的 if (x < 10) break; 的作用。