乘以两个大数

时间:2016-01-01 18:31:27

标签: c largenumber multiplying

我有这个问题需要乘以两个大数字。我想添加第一个数字A,B次(B是第二个数字)。我制作了添加两个大数的算法。所以我认为这会奏效。问题是,这个算法需要很长时间吗? ,多次为自己添加一个数字?

2 个答案:

答案 0 :(得分:2)

  

问题是,这个算法需要很长时间吗? ,多次为自己添加一个数字?

是。当您将 b 添加到 a 时,这是一种非常慢的数字乘法方法,可以将 b 添加到 a 次。为了获得更好的性能并且仍然是一个相当简单的算法,请考虑这样的移位和添加过程(将 a b 相乘,将结果放在 q ):

  1. q ←0, i ←0
  2. 如果 2 i > a 然后返回 q
  3. 如果 a & (1« i 然后 q q +( b « I 的)
  4. i i + 1
  5. 转到 2
  6. 针对此类问题的快速算法包括Karatsuba multiplicationToom-Cook multiplicationSchönhage-Strassen multiplication

答案 1 :(得分:1)

检查此算法:

long long multiply(long long a, long long b)
{
    if(a < b)
        swap(a, b);

    long long c = 0;

    for(int i = 0; (1ll << i) <= b; ++i)
    {
        if(((b >> i) & 1ll) == 1ll)
        {
            c += a << i;
        }
    }

    return c;
}

它以min(a,b)的对数速度工作。 如果您的数字非常大,快速傅立叶变换(https://en.wikipedia.org/wiki/Fast_Fourier_transform)和Karatsuba算法(https://en.wikipedia.org/wiki/Karatsuba_algorithm)可能对您有帮助。