递归数字和

Recursive Digit Sum

本文关键字:数字 递归      更新时间:2024-05-10

我试图在hackerlink上解决这个问题。但我遇到了一些问题。具体问题是:

例如:

  1. 数字9875的总和将计算为:sum(9875(=9+8+7+5=29

    sum(29(=11

    sum(11(=2。(使用递归函数(

  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返回9SuperDigit(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;
}