我写了一个程序,用C ++中的字符串来划分大数字。这是一个字符串,用于存储数字的每个数字。我使用连续减法来得到余数和商。
For ex:
16/5
Subtract 16-5=11
11-5=6
6-5=1
1 is less than 5 so stop
quotient = 3 and remainder = 1
但问题是这种方法对于非常大的数字来说非常慢。 还有什么其他方法可以让它快速?
答案 0 :(得分:3)
获得快速bignum计算的一种方法是为基数使用高值。
作为一个例子考虑总和
12301922342343 +
39234932348823
--------------
51536854691166
当手动执行此计算时,从最右边的数字开始并总结它们如果结果超过9则保持“进位”。从右到左3 + 3 = 6,4 + 2 = 6,3 + 8 = 1 +携带1,2 + 8 + 1 = 1 +携带1,依此类推。
然而,您可以做的是以多个数字块进行计算...例如
012 301 922 342 343 +
039 234 932 348 823
-------------------
051 536 854 691 166
这是与以前相同的计算,但现在我使用的是基数1000而不是基数9(数字从000到999),我可以使用相同的方法。最右边的数字是343 + 823 = 166携带001,342 + 384 + 001 = 691,922 + 932 = 854携带001等等。
为了能够轻松进行乘法(对于除法算法也需要),对于具有32位整数的基数的合理选择是9999,因为9999 * 9999仍然小于2 ** 32,因此可以直接计算溢出。
使用10 ** n形式的基础可以轻松地一次打印十进制数字的结果。
答案 1 :(得分:0)
我过去曾试图对bignums进行编程,我的解决方案是将分子的最高有效位(s)除以分母的最高有效位,并调整比例差异。这是答案的第一个数字。将此分母乘以分母,然后从分子中减去它。然后重复这个作为新的分子。这就像小学的长期分工一样
10000 / 3
=10/3 * 1000 + ?
=3*1000 + ?
=3000 + (10000-3000*3)/3
=3000 + (1000 / 3) //repeat recursively from beginning
答案 2 :(得分:0)
有一些非常快速的(O(n log n)时间)算法用于bignum乘法,因此你可以使用二进制搜索来获得O(n *(log n)^ 2)总时间
答案 3 :(得分:-1)
我减去数字的n *倍。但是正如你所说的那么慢。
但请考虑一下:
Dividend Divisor
123456789 987
9 digits vs 3 digits
9 digits - 3 digits = 6 , subtract 1 so the factor is 5: 10^5 = 100.000
这样:
9 digits 3+5 digits = 100.000 times
123.456.789 - 987*100.000 = 24.756.789
----------------------------------------------
8 digits 3+4 digits = 10.000 times (now 110.000 times)
24.756.789 - 9.870.000 = 14.886.789
-----------------------------------------------
8 digits 3+4 digits = 10.000 times (120.000 times)
14.886.789 - 9.870.000 = 5.016.789
-----------------------------------------------
7 digits 3+3 digits = 1000 times (121.000 times)
5.016.789 - 987.000 = 4.029.789
-------------------------------------------------
依旧......
希望它有所帮助!