麻烦在C中递归递增

时间:2013-06-06 20:52:14

标签: c recursion

我无法将123241536287914341这样的长正数与常数正数(例如23,... 9)相乘C使用递归。我了解如何将长正数乘以10100等,因为您只需要在最后添加适当数量的0。如果使用两个函数乘以234 ....,我该怎么做?

即。像

这样的功能
char* multi(char *num1, char d)

以及递归辅助函数,例如

void multi_helper(char *a, char *r, char b, int len, int carry)

这是我乘以10的代码,但格式不同:

char *getmem(int len) {
    char *ret;
    ret = malloc(len);
    if (NULL == ret) {
        printf("memory allocation failed!\n");
        exit (0);
    }
    else
        return ret;
}

char *shiftleft(char *a) {
    char *l = getmem(strlen(a)+2);
    strncpy(l,a,strlen(a));
    l[strlen(a)] = '0';
    l[strlen(a)+1] = 0;
    return l;
}

2 个答案:

答案 0 :(得分:1)

将您的计数作为参数传递给递归函数。每个级别在传递给下一级之前减去1。在0时,退出递归并返回添加的值。假设您有代码而不是可以添加“大”数字,并且您不会尝试乘以891748917或其他东西(堆栈溢出。)

答案 1 :(得分:0)

这是一些非常匆匆写的草率代码,它执行此操作(在反向字符串上;您可以在调用它之前和之后反转您的数字)。使用相同的方法将您(希望)学习的数字乘以幼儿,这不是 与数字在硬件中的乘积方式不同...

// assumes number is reversed (for example, 100 would be represented as 001)
void mult_string(char *string, int multiplier, int carry)
{
    // If at end of number just add the carry digits one by one recursively
    if (*string == '\0')
    {
        if (carry == 0)
            return;
        unsigned short digit = carry%10;
        *string = (char)(digit + '0');
        // Will crash if string isn't long enough, you should address that if you actually use this code
        string[1] = '\0';
        mult_string(string + 1, multiplier, carry/10);
        return;
    }

    // Carry into next multiplication will be the tens digit of the current carry
    int newCarry = carry/10;
    unsigned short digit = *string - '0';
    unsigned short newDigit = digit * multiplier;
    // Add tens digit from result of multiplying the digit to carry
    newDigit += carry%10;
    newCarry += newDigit/10;
    newDigit %= 10;

    // Write out the multiplied digit
    *string = (char)(newDigit + '0');

    // Recursively multiply the rest of the string, with carry 
    mult_string(string + 1, multiplier, newCarry);
}

但是,我建议不要将数字表示为字符串。这是非常低效和不直观的。如果您需要存储和操作任意大数字,那么还有许多其他人已经以更好的方式解决了问题,例如libgmpbigint等。