我有这个问题需要乘以两个大数字。我想添加第一个数字A,B次(B是第二个数字)。我制作了添加两个大数的算法。所以我认为这会奏效。问题是,这个算法需要很长时间吗? ,多次为自己添加一个数字?
答案 0 :(得分:2)
问题是,这个算法需要很长时间吗? ,多次为自己添加一个数字?
是。当您将 b 添加到 a 时,这是一种非常慢的数字乘法方法,可以将 b 添加到 a 次。为了获得更好的性能并且仍然是一个相当简单的算法,请考虑这样的移位和添加过程(将 a 和 b 相乘,将结果放在 q ):
针对此类问题的快速算法包括Karatsuba multiplication,Toom-Cook multiplication和Schö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)可能对您有帮助。