缩位求和
一、题目内容
题目描述
在电子计算机普及以前,人们经常用一个粗略的方法来验算四则运算是否正确。比如:248 * 15 = 3720,把乘数和被乘数分别逐位求和,如果是多位数再逐位求和,直到是1位数,得
2 + 4 + 8 = 14 ==> 1 + 4 = 5;
1 + 5 = 6
5 * 6
而结果逐位求和为 3,5 * 6 的结果逐位求和与3符合,说明正确的可能性很大!(不能排除错误)请你写一个计算机程序,对给定的字符串逐位求和。
输入
输入为一个由数字组成的串,表示n位数(n<1000);
输出
输出为一位数,表示反复逐位求和的结果。
样例输入
35379
样例输出
9
二、思路分析
题目比较好理解,就是逐位求和,最终输出一位数。用字符串输入应该比较好处理。方法二就是正常通过循环,/,%的操作实现的,稍微复杂一点。方法一利用C++STL的一个函数,将数值再次转换为字符串,从而更新字符串的内容。
string to_string(numberic_value);
这个函数是在C++11标准中定义的,是以<string>标头的库函数,用于将数值(数字)转换为字符串。在函数中string是返回类型,即函数返回一个字符串对象,其中包含字符串格式的数字值,numbric_value是可以为整数,浮点数,长整数,双精度数的数字。
using namespace std; 是一条语句,告诉编译器使用名为std的命名空间,如果我们不编写此语句,则需要对所有函数、对象使用std :: 。
三、代码实现
方法一:
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
int sum = 0;
while (s.length() != 1) { //循环终止条件,字符串s只剩一位
sum = 0; //每次循环前置零
for (int i = 0; i < s.length(); ++i) {
sum += (s[i] - '0'); //char转int
}
s = std::to_string(sum); //将字符串s更新s
}
cout << s << endl;
return 0;
}
方法二:
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
int sum = 0;
for (int i = 0; i < s.length(); i++) { //第一次逐位求和
sum += (s[i] - '0'); //char转int
}
int t = sum;
while (t >= 10) { //再次逐位求和,直到为一位数
t = 0;
while (sum) {
t += sum % 10;
sum /= 10;
}
sum = t;
}
cout << t << endl;
return 0;
}
加油哦! 如有错误和需要改进完善之处,欢迎大家纠正指教。