当前位置:  开发笔记 > 人工智能 > 正文

乘以最多20个30位数字

如何解决《乘以最多20个30位数字》经验,为你挑选了1个好方法。

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

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

    从你的用户那里得到你想要数字的数字是另一个问题,比如在获取数字时你必须知道这些数字中的每一个都有最多30个数字来填充,如果我想从用户那里得到数字52我不要输入52和28之后的零,就像52本身一样:

输入: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;
 }

Katie.. 8

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

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



1> Katie..:

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

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

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有