递归数字和
Recursive Digit Sum
我试图在hackerlink上解决这个问题。但我遇到了一些问题。具体问题是:
例如:
数字9875的总和将计算为:sum(9875(=9+8+7+5=29
sum(29(=11
sum(11(=2。(使用递归函数(
- 在我的测试用例中,(n='9875',k=4(数字p是通过将字符串nk连接多次来创建的,因此初始p=9875987598759875(字符串'9875''重复4次(
但是当我编写这个测试用例时,它不起作用。这是我的源代码:
int SuperDigit(long n){
long sum =0;
if(n==0) return 0;
else{
return sum= sum +(n%10 + SuperDigit(n/10));
}
if(sum>10){
return (sum%10 + SuperDigit(sum/10));
}
}
int main(){
string n;cin>>n;
int T;cin>>T;
string repeat;
for(int i=0; i <T;i++){
repeat += n;
}
cout<<repeat;
long x=0;
stringstream geek(repeat);
geek>>x;
long sum = SuperDigit(x);
printf("n%ld ",sum);
for(int i=0;i<10;i++){
if(sum>=10){
sum = SuperDigit(sum);
}
else{
break;
}
}
printf("n%ld ",sum);
}
如果我尝试:n='123'和k=3(预期输出:9(
我的输出将是正确的,以下是我对这个测试用例的输出:
123 3
123123123
18
9
但是当我尝试n="9875"并且k=4时(预期输出:8(
我的输出将是错误的:
9875 4
9875987598759875
46
1
正如您在这个测试用例中看到的,所有数字的第一个和必须是116。但我的节目只显示46.
有人能为我解释吗?非常感谢!
在当前代码中,您过早地在中return
if(n==0) return 0;
else{
return sum= sum +(n%10 + SuperDigit(n/10));
}
假设n == 89
,那么n%10
返回9
,SuperDigit(n/10)
返回8
,并且您有17
作为答案(当需要8
时(。
你可以把它作为
int SuperDigit(long n) {
int result = 0;
/* We compute digital root (sum of digits) */
for (long number = n; number != 0; number /= 10)
result += (int) (number % 10);
/* if result is out of range [-9..9]
we compute digital root again from the answer */
if (result < -9 || result > 9)
result = SuperDigit(result);
return result;
}
您可以简化程序,如下所示。由于您想递归地查找和,下面的程序显示了一种可能的方法
版本1:使用递归函数
#include <iostream>
int findDigit(int passed_num, int currentSum)
{
int lastDigit;
if (passed_num == 0) {
return currentSum;
}
// find the last didit
lastDigit = passed_num % 10;
currentSum+= lastDigit;
//call findDigit() repeatedly
currentSum = findDigit(passed_num / 10, currentSum);
std::cout<<lastDigit<<" ";
return currentSum;
}
int main()
{
std::cout << "Enter a number: ";
int input_num, sum;
std::cin>>input_num;
sum = findDigit(input_num, 0);
std::cout<<"sum is: "<<sum<<std::endl;
std::cout << "Enter another number: ";
std::cin>>input_num;
sum = findDigit(input_num, 0);
std::cout<<"sum is: "<<sum<<std::endl;
return 0;
}
请注意,有更简单(其他(的方法可以在不使用递归的情况下找到和。一种这样的方式如下所示:
版本2:使用循环
#include <string>
#include <iostream>
int main()
{
std::cout << "Enter a number: ";
int individual_number = 0, sum = 0;//these are local built in types so initialize them
std::string input_num;
std::cin >> input_num;
for(char c : input_num)
{
individual_number = c -'0';
std::cout<<individual_number<<" ";
sum+= individual_number;
}
std::cout<<"total amount: "<<sum<<std::endl;
// std::cout<<"The sum comes out to be: "<<sum<<std::endl;
return 0;
}
相关文章:
- 递归形成字符串中所有数字字符的中间和?
- 如何使用递归检查数字是否有重复数字?
- 仅使用加法/递归C++对数字进行平方
- 使用带有一个参数函数的递归找到数字的平方
- C++[递归]将一个数字写成2的升序之和
- 如何编写一个递归函数,以随机的方式混淆从0到6的数字
- 如何使用递归计算从 0 到给定数字的奇数?
- C++ 递归:返回数字的最小偶数
- Fibbonaci 递归代码返回错误值,始终返回下一个数字
- 递归推动POP POSTFIX计算器无法正确执行操作,只需将最后一个数字作为结果
- 递归函数有助于显示反向数字
- 递归地将给定字符串转换为它所表示的数字
- 优化递归问题以计算超级数字
- 递归函数用于计算 n 个数字之和的意外输出
- 编写一个函数,用递归函数检查数字是否是正方形
- 递归计算满足条件的值数并返回该数字
- 将目标数字拆分为一系列数字(递归任务)
- 如何使用递归按从 1 到 n 的升序打印数字,其中 n 在该函数的参数中给出
- 递归函数,用于计算数字中的位数
- 求和数字递归C++