【问题标题】:Recursive Digit Sum递归数字和
【发布时间】:2022-01-02 22:40:54
【问题描述】:

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

例如:

  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.

谁能帮我解释一下?非常感谢!

【问题讨论】:

  • 你是对的。所以最后一部分是所有无法访问的代码,什么都不做。 if(sum&gt;10){ return (sum%10 + SuperDigit(sum/10)); }
  • 您是否已经使用调试器来查看您的代码实际在做什么?
  • 请注意,您不需要创建这么大的数字,它可能会溢出。
  • 提示:SumOfDigits(SumOfDigits(123) * 3) == SumOfDigits(123123123)(或者应该是)。
  • 谁能帮我解释一下? -- 你得先把精力放到debugging your own code.。学习如何调试自己的程序是学习编程的一部分。否则,它会变成编写代码的情况,看到它不起作用,然后你就坐下来,而 StackOverflow 上的其他人调试你的代码——它不会那样工作。

标签: c++ algorithm


【解决方案1】:

您可以简化您的程序,如下所示。由于您想递归地求和,下面的程序显示了一种可能的方法。

版本 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;
}

【讨论】:

  • 在其他更简单的版本中,您可能想尝试使用 std::accumulate
【解决方案2】:

在你当前的代码中你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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-28
    • 2015-08-30
    • 2020-03-19
    • 1970-01-01
    • 2012-04-12
    • 2013-04-06
    • 2022-01-14
    • 1970-01-01
    相关资源
    最近更新 更多