【问题标题】:Dividing very big integers stored as string in C++在 C++ 中将存储为字符串的非常大的整数相除
【发布时间】:2014-09-12 18:08:48
【问题描述】:

我正在尝试找出一种算法,用于将一个大数与另一个大数(最多约 200 位)相除,并且都以字符串形式存储为小数。

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

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

我发现的所有简单算法都非常复杂或不适合我的需求。我发现它应该可以通过加法、减法和乘法来解决,但完全不知道如何解决,而且我找不到任何扎实的基础知识。

谢谢

【问题讨论】:

  • 也许谷歌“长除法”。
  • 元首划分方法?
  • @Galik:我看过这个方法,但认为它是在学校学到的——不是吗?好的,对不起,比这个愚蠢的问题。
  • 是的,它在学校教过,但我认为它适合你的情况。如果您不想,则不需要使用整数类型。您可能需要创建自己的基于字符串的数学函数来执行各个部分(减法等)。
  • How to implement big int in C++ 的可能重复项

标签: c++ string numbers division


【解决方案1】:

您可以通过使用除法指令生成部分商来加速长除法。将被除数的前 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/3 = 1。乘/减 = 30。3/3 = 1,乘/减 = 1。1

下一个部分数字是 1/3 = 0。19 是

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

【讨论】:

  • 这是非常有帮助的好主意!谢谢
【解决方案2】:

我刚刚发现了我的问题,这真的很微不足道 - 我不知道如何除以大于例如long int,这里的解决方案是减法。因此,我将使用长除法。 谢谢你,很抱歉提出愚蠢的问题

【讨论】:

  • 糟糕的解决方案,有更好的解决方案,请参阅@rcgkdr 的回答。
猜你喜欢
  • 2013-10-13
  • 2022-06-15
  • 1970-01-01
  • 2023-04-01
  • 2015-03-16
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多