12

我需要编写一个算法(我不能使用任何 3rd 方库,因为这是一个分配)来划分(整数除法,浮动部分并不重要)非常大的数字,比如 100 - 1000 位。我找到了http://en.wikipedia.org/wiki/Fourier_division算法,但我不知道这是否是正确的方法。你有什么建议吗?

1) check divisior < dividend, otherwise it's zero (because it will be an int division)
2) start from the left
3) get equal portion of digits from the dividend
4) if it's divisor portion is still bigger, increment digits of dividend portion by 1
5) multiply divisor by 1-9 through the loop
6) when it exceeds the dividend portion, previous multiplier is the answer
7) repeat steps 3 to 5 until reaching to the end
4

5 回答 5

11

我想像在小学那样划分“长”路将是一条潜在的路线。我假设您将原始数字作为字符串接收,所以您要做的是解析每个数字。例子:

步骤 0:

   /-----------------
13 | 453453453435....

第 1 步:“13 进入 4 多少次?0

     0
   /-----------------
13 | 453453453435....

第 2 步:“13 变成 45 多少次?3

     03
   /-----------------
13 | 453453453435....
   - 39
     --
      6

第 3 步:“13 变成 63 多少次?4

等等等等。使用这种策略,你可以有任何数字长度,并且只需要在内存中为 int (除数)和 double (除数)保存足够的数字。(假设我的这些条款是正确的)。您将结果存储为结果字符串中的最后一位。

当您遇到没有数字剩余且计算不会进行 1 次或多次的点时,您会返回已格式化为字符串的结果(因为它可能比 int 大)。

于 2010-05-21T17:37:07.957 回答
11

对大数实现的最简单的除法算法是移位和减法。

if numerator is less than denominator then finish
shift denominator as far left as possible while it is still smaller than numerator
set bit in quotient for amount shifted
subtract shifted denominator from numerator
repeat
the numerator is now the remainder

转移不一定是字面的。例如,您可以编写一个算法来从另一个值中减去一个左移值,而不是在减去之前实际将整个值左移。比较也是一样。

长除法很难实现,因为长除法的步骤之一是长除法。如果除数是一个整数,那么你可以很容易地进行长除法。

于 2010-05-21T18:42:13.977 回答
9

Knuth, Donald,计算机编程的艺术,ISBN 0-201-89684-2,第 2 卷:半数值算法,第 4.3.1 节:经典算法

于 2010-05-21T17:38:08.910 回答
3

您可能应该尝试使用长除法之类的方法,但使用计算机单词而不是数字。

在高级语言中,将“数字”视为最大固定精度整数的一半是最方便的。对于长除法,您需要处理部分中间结果可能相差 1 的情况,因为您的固定精度除法只能处理任意精度除数的最重要部分。

有更快和更复杂的方法来做任意精度的算术。查看相应的维基百科页面。特别是,如果仔细实施 Newton-Raphson 方法,可以确保除法的时间性能在任意精度乘法的常数因子内。

于 2010-05-21T17:49:01.720 回答
1

除非你的部分作业是完全原创的,否则我会使用我(我假设你)在小学教过的算法,用于手工进行大除法。

于 2010-05-21T17:34:44.817 回答