-1

我在使用递归将长正数123241536287914341与 C 中的常数正数(如2, 3, ... )相乘时遇到问题。9我了解如何将长正数乘以10,100或等等,因为您只需要0在末尾添加适当数量的 s 即可。当使用两个函数乘以2, 3, 4.... 时,我将如何做到这一点?

即一个函数,如

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;
}
4

2 回答 2

1

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

于 2013-06-06T21:21:38.880 回答
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等。

于 2013-06-06T21:24:58.637 回答