给定一个正整数 n,若 n 在十进制下的各位数字之和小于10,则这个和是 n 的数根。否则,继续求这个和在十进制下的各位数字之和,直到结果小于 10 为止,定义最后的结果为 n 的数根。
例如,456 的数根为 6,因为 4+5+6=15,继续分解得 1+5=6。给定 n,请输出它的数根。注意,有一部分 n 非常大。
给定一个正整数 n,若 n 在十进制下的各位数字之和小于10,则这个和是 n 的数根。否则,继续求这个和在十进制下的各位数字之和,直到结果小于 10 为止,定义最后的结果为 n 的数根。
例如,456 的数根为 6,因为 4+5+6=15,继续分解得 1+5=6。给定 n,请输出它的数根。注意,有一部分 n 非常大。
引自免费微信小程序:皆我百晓生
为了计算任意大的正整数的数根,我们可以编写一个递归函数,当数字之和小于10时返回当前的和,否则继续进行求和。这里是一个详细的C++实现:
#include <iostream>
#include <string>
int sumDigits(const std::string &num) {
int sum = 0;
for (char digit : num) {
sum += digit - '0';
}
return sum;
}
int findRoot(int n) {
if (n < 10) {
return n;
} else {
std::string strN = std::to_string(n);
return findRoot(sumDigits(strN));
}
}
int main() {
int n;
std::cout << "Enter a large number: ";
std::cin >> n;
// 对于非常大的数字,可能需要考虑溢出问题,这里我们仅处理能表示的整数范围内的数值。
if (n > INT_MAX / 10) {
std::cerr << "Number is too large to compute the root." << std::endl;
return 1;
}
int root = findRoot(n);
std::cout << "The root of " << n << " is " << root << std::endl;
return 0;
}
这段代码首先将输入的整数转换成字符串,然后逐个字符地加总得到数字之和。如果和小于10,就返回这个和作为数根;否则,继续对和执行相同的操作,直到找到数根。
注意:对于非常大的数字(超过INT_MAX/10
),可能会导致整型变量溢出。在实际应用中,你可能需要使用更大容量的数据类型,比如long long
,并且相应地调整溢出检查条件。同时,对于非常大的数字,计算过程可能会比较耗时。