在C ++中将存储为字符串的非常大的整数除

时间:2014-09-12 18:08:48

标签: c++ string numbers division

我试图找出一个算法,用于将一个大数字与其他大数字分开(最多约200个数字),并且这两个数字都以小数形式存储为字符串。

我不能使用学校的经典算法,因为分隔符需要存储为一些经典类型(long long int等)。

我把它作为一种练习,所以效率或类似的东西不是这里的问题 - 只是最简单的方式(不像Furier ......)。

我发现的所有简单算法都非常复杂或不符合我的需要。我发现它只能通过加,减和乘法来解决,但绝对不知道我怎么能找到任何可靠的基础知识。

谢谢

2 个答案:

答案 0 :(得分:3)

您可以使用除法指令生成部分商来加速长除法。将被除数的前导1或2位除以除数的前导数位1,这将低估商数。然后将除数(全长)乘以商数,并从被除数中减去。第二次重复此操作,商数应正确或小于应有的数字1。将被除数的前导数字与除数数字进行比较,看看商数是否可以增加+1,然后重复乘(减1)/减去。

除数为29,使用前导数字+ 1 = 2 + 1 = 3进行整数除法产生部分商:

      620
    -----
      11
      510 
    -----    
29 |17999
    145
    ---
     34
     29
    ---
      59
      29
      --
      30
      29
      --
       19
        0
       --
       19

17999/29 = 620,其余为19

为了解释这一点,除数是29,所以用3来产生部分商。第一个部分商是17/3 = 5.然后从179 = 34乘以/减去除数5.下一个部分商是3/3 = 1.从34 = 05.05乘以/减去<除数,所以这一步完成,商数为5 + 1 = 6.

下一个部分商数字是5/3 = 1.乘/减= 30. 3/3 = 1,乘/减= 1. 1<除数如此完成。商数位= 1 + 1 = 2.

下一个部分数字是1/3 = 0. 19是<除数如此完成。 quotient = 620,余数= 19。

注意,如果除数的第一个数字是9,那么使用9 + 1 = 10计算部分商,所以部分商=除数的前导数/ 10。你还必须转换两个为了进行每个除法步骤,将被除数的前导数字转换为整数(除了仅使用被除数的一个前导数字或伪造前导零的初始步骤之外)。

答案 1 :(得分:0)

我刚刚发现了什么是我的问题,这真的很微不足道 - 我不确定如何划分大于例如long int这里的解决方案是通过减法来实现的。因此我将使用长除法。 谢谢,抱歉愚蠢的问题