簡體   English   中英

在C中逐個數字地對兩個數字求和

[英]Summing two numbers recursively digit by digit in C

我需要寫遞歸函數,在第一個函數中,我需要逐位求和兩個整數。 我已經寫了一些代碼,但是它給了我最終的結果乘以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;
}
return (mul*temp) + sum(a/10, b/10);

應該:

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

您不需要靜態變量, 靜態變量用於實現全局狀態,該狀態的整個生命周期范圍。 這不是可取的,只能在不得已時使用。 此外,這里絕對不是您需要的,使用靜態變量來實現您的解決方案將導致僅在首次調用它們時起作用的函數。

您應該使用算法的遞歸屬性來聚合結果:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM