乘以最多20个30位数字

时间:2016-01-01 00:58:11

标签: c loops

我被赋予了一个任务,可以将多达20个数字乘以30个数字。我想出了一个算法,通过在具有二次复杂度的两个循环中的两个数字的数字相乘来将两个数字与30个数字相乘。 (我认为接近30位数的最佳方法是将数字的数字存储在具有20个数字的2D整数数组中,并且每个数字中的每一个都有30个空闲插槽来填充这些插槽中的数字)结果将是 存储在30位数的数组中。现在这里是我的问题和问题:

  1. 如何一次乘以超过2位数的30位数?我应该使用哪种循环?我想出了如何只乘以2个30位数字。

  2. 获取您想要与用户相乘的数字是另一个问题,例如在获取数字时,您必须知道这些数字中的每一个都有最多30位数字来填充,就像我想从中获取数字52用户我之后不要输入52和28个零,就像52本身一样:

  3. 输入:520000000000000000000000000000错误

    输入:52是正确的,如果我们在52之后没有输入28个零。

    以下是我将2个数字乘以30位数的算法:

    for (i = 29; i >= 0; i--)
     {
        for (j = 29, carry_in = 0; j >= 0; j--) 
        {
            n =number_1[i] * number_2[j] + result[i] + carry_in;
            carry_in = n / 10;
            result[i] = (n % 10);
        }
        result[i] += carry_in;
     }
    

1 个答案:

答案 0 :(得分:8)

您应该实现Karatsuba algorithm。您应该将函数编写为int* multiply(int* a, int* b),将main中的累加变量初始化为20个数字中的一个,然后在累加变量和剩余的19个数字之间循环multiply

另一方面,您的结果上限为600位,这相对较小,实际上Karatsuba将与所有已知的(基于FFT的)乘法算法一样快,具有更好的渐近时间复杂度。如果你有一个非常大的数字(> 10 ^ 4位数),我会使用Schönhage-Strassen或其衍生产品,如Fürer。