字符串中的大数字划分

时间:2011-10-29 04:34:42

标签: c++ division largenumber

我写了一个程序,用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

但问题是这种方法对于非常大的数字来说非常慢。 还有什么其他方法可以让它快速?

4 个答案:

答案 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
-------------------------------------------------

依旧......

希望它有所帮助!