[蓝桥杯]缩位求和
缩位求和
题目描述
在电子计算机普及以前,人们经常用一个粗略的方法来验算四则运算是否正确。
比如:248×15=3720248×15=3720
把乘数和被乘数分别逐位求和,如果是多位数再逐位求和,直到是 1 位数,得
2+4+8=14==>1+4=52+4+8=14==>1+4=5;
1+5=61+5=6;
5×65×6
而结果逐位求和为 3。
5×65×6 的结果逐位求和与 3 符合,说明正确的可能性很大!!(不能排除错误)
请你写一个计算机程序,对给定的字符串逐位求和。
输入描述
输入描述
输入为一个由数字组成的串,表示 n (n<1000)n (n<1000) 位数;
输出描述
输出为一位数,表示反复逐位求和的结果。
输入输出样例
示例
输入
35379
输出
9
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
总通过次数: 5516 | 总提交次数: 5917 | 通过率: 93.2%
难度: 中等 标签: 2018, 模拟, 省赛
方法思路
题目要求对输入的数字字符串反复进行逐位求和,直到结果变为一位数。解决思路如下:
-
循环计算:只要数字字符串长度大于1,就继续求和
-
逐位求和:遍历字符串的每个字符,将其转换为数字后累加
-
更新字符串:将求和结果转换为字符串,作为下一轮输入
-
终止条件:当字符串长度为1时,输出结果
这种方法利用了数字位数快速减少的特性(1000位数字求和后最多变为4位数,再求和最多变为2位数),因此效率很高。
#include <iostream>
#include <string>
using namespace std;int main() {string s;cin >> s;while (s.length() > 1) {int sum = 0;for (char c : s) {sum += c - '0'; // 字符转数字并累加}s = to_string(sum); // 将求和结果转为字符串}cout << s << endl;return 0;
}
代码解释
-
输入处理:读取数字字符串
s
-
循环求和:
-
当字符串长度大于1时继续循环
-
初始化求和变量
sum = 0
-
遍历字符串每个字符:
c - '0'
将字符转换为对应数字并累加到sum
-
将求和结果
sum
转换为字符串,更新s
-
-
输出结果:当字符串长度为1时,输出最终结果
示例说明
-
输入 "35379":
-
第一轮:3+5+3+7+9 = 27 → 字符串变为"27"
-
第二轮:2+7 = 9 → 字符串变为"9"(输出)
-
-
输入 "999":
-
第一轮:9+9+9 = 27 → "27"
-
第二轮:2+7 = 9 → 输出"9"
-
-
输入 "0":直接输出"0"
-
输入 "10":1+0=1 → 输出"1"