在C中逐位递归地对两个数字求和

时间:2013-11-18 21:17:29

标签: c recursion sum digit

我需要写入递归函数,在第一个函数中,我需要逐位求和两个整数。我写了一些代码,但它给了我最终结果乘以10.我看到问题发生了,因为当我将前两位数相加时,我将它们乘以10。

第二个函数必须计算总和中的进位数。意思是如果两个数字分别是3和8,那么当我们求和时,我们得到11,即结果1,并且进行1.简单地说,我只需要计算发生了多少次数。

请注意,我假设这两个数字的位数相同。

#include <stdio.h>

int sum(int a, int b)
{
    int temp = (a%10) + (b%10);
    static int mul = 1;

    if(a == 0 && b == 0)
        return 0;
    else
    {
        mul *= 10;
        return (mul*temp) + sum(a/10, b/10);
    }
}

int carry(int a, int b)
{
    static int counter = 0;

    if((a%10) + (b%10) > 9)
        counter++;

    if(a == 0 && b == 0)
        return counter;

    carry(a/10, b/10);

}

int main()
{
    int a = 1941;
    int b = 2282;

    int result = sum(a, b);
    printf("%d\n", result);

    int car = carry(a, b);
    printf("%d\n", car);

    return 0;
}

1 个答案:

答案 0 :(得分:3)

return (mul*temp) + sum(a/10, b/10);

应该是:

return temp + 10*sum(a/10, b/10);

您不需要静态变量,Static variables用于实现其生命周期范围为整个过程的全局状态。这不是理想的事情,只应该在最后使用。此外,这绝对不是您需要的,使用静态变量来实现您的解决方案将导致只在第一次调用时才起作用的函数。

您应该使用算法的递归属性来聚合结果:

int sum(int a, int b)
{
    if(a == 0 && b == 0) {
        return 0;
    }
    else
    {
        return (a%10) + (b%10) + 10*sum(a/10, b/10);
    }
}

sum(1941, 2282)将扩展为:

sum(1941, 2282)
1 + 2 + 10*sum(194, 228)
1 + 2 + 10*(4 + 8 + 10*sum(19, 22))
1 + 2 + 10*(4 + 8 + 10*(9 + 2 + 10*sum(1, 2))
1 + 2 + 10*(4 + 8 + 10*(9 + 2 + 10*(1 + 2 + 10*sum(0, 0))
1 + 2 + 10*(4 + 8 + 10*(9 + 2 + 10*(1 + 2 + 10*0)

您应该对carry使用相同的方法:

int carry(int a, int b)
{
    if(a == 0 && b == 0) {
        return 0;
    }
    else if((a%10) + (b%10) > 9) {
        return 1 + carry(a/10, b/10);
    }
    else {
        return carry(a/10, b/10);
    }
}

carry(1941, 2282)将扩展为:

carry(1941, 2282)
0 + carry(194, 228)
0 + 1 + carry(19, 22)
0 + 1 + 1 + carry(1, 2)
0 + 1 + 1 + 0 + carry(0, 0)
0 + 1 + 1 + 0 + 0