递归函数,用于求和整数的奇数位

时间:2010-12-13 18:34:35

标签: c recursion

例如,n = 8135267 => 16 这是一个解决方案,但我不明白。

int sumOddDigits(int n) {

if(n == 0)
   return 0;

if(n%2 == 1) //if n is odd
   //returns last digit of n + sumOddDigits(n/10) => n/10 removes the last digit of n
   return n % 10 + sumOddDigits(n/10) 

else
   return sumOddDigits(n/10); 

}

5 个答案:

答案 0 :(得分:2)

整数十分之一“切断”最后一位数:I.e。 1234/10会产生123

模10返回最后一位数:即1234%10得到4

因此,上述代码始终考虑最后一位数。如果最后一个数字是奇数(因此是%2==1个东西),它将被计算,否则不计算。所以,如果它应该计算数字,它需要最后一个数字(% 10 - 东西)并继续计算剩余的数字(递归/10 - 东西)并将它们添加到数字。如果不计算当前数字,它将继续使用剩余数字(因此递归和/10 - 东西)而不将其添加到当前数字。

如果参数为0,则表示遍历整数,因此函数以返回0结束。

答案 1 :(得分:1)

%是modulo运算符。它基本上找到除以数字的余数。

n%2 n只有1才是奇数。 %10得到除以10的剩余部分,这将获得当前的最后一位数字。整数除以10会得到下一个数字作为当前最后一位(1567/10 = 156)

答案 2 :(得分:0)

以这种方式思考:从8135267 => 16的已知答案开始,如果我问你 * 3 * 8135267中奇数位的总和,那么呢?如果我要求 * 4 * 8135267怎么办?您的手册步骤与该功能有何关系?

答案 3 :(得分:0)

这样想。如果你得到偶数,你的函数会返回它+没有那个数字的数字的函数值。否则返回没有最后一位数字的函数值。在你的例子中:

813526(7) -> 0 + sumEvenDigits(813526)
                       6 + sumEvenDigits(81352)
                                 2 + sumEvenDigits(8135)
                                          ....
                                            8 + sumEvenDigits(0)
                                                      0 = 16

希望这有帮助。

答案 4 :(得分:0)

int sum_odd_digits(int n)
{
  int s=0,r=0;
  if(n==0)
    return 0;
  r = n%10;
  if(r%2==1)
  s = s+r;
  n=n/10;
  
  return s+ sum_odd_digits(n);
}