Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 大数除法_C++_Algorithm_Math_Largenumber - Fatal编程技术网

C++ 大数除法

C++ 大数除法,c++,algorithm,math,largenumber,C++,Algorithm,Math,Largenumber,我需要写一个算法(我不能使用任何第三方库,因为这是一个赋值)来除法(整数除法,浮动部分不重要)非常大的数字,比如100-1000位。我找到了算法,但我不知道这是否正确。你有什么建议吗 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 divid

我需要写一个算法(我不能使用任何第三方库,因为这是一个赋值)来除法(整数除法,浮动部分不重要)非常大的数字,比如100-1000位。我找到了算法,但我不知道这是否正确。你有什么建议吗

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
1)检查divisior
除非你的作业中有一部分是完全原创的,否则我会采用小学时教我(我想你也是)的算法,用手进行大除法。

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

步骤0:

   /-----------------
13 | 453453453435....
第1步:“13变成4的次数是多少

     0
   /-----------------
13 | 453453453435....
第二步:“13变成45的次数是多少?三,

     03
   /-----------------
13 | 453453453435....
   - 39
     --
      6
第三步:“13变成63的次数是多少

诸如此类。使用这种策略,您可以拥有任意长度的数字,并且只需要在内存中保存足够的整数(除数)和双精度(被除数)。(假设我正确地理解了这些术语)。您将结果存储为结果字符串中的最后一个数字


当您到达一个没有数字保留的点,并且计算不会进行1次或多次时,您将返回已格式化为字符串的结果(因为它可能大于int)《计算机编程的艺术》,ISBN 0-201-89684-2,第2卷:半数值算法,第4.3.1节:经典算法。

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

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


做任意精度的算术有更快更复杂的方法。查看相应的。特别是,仔细实施牛顿-拉斐逊法时,可以确保除法的时间性能在任意精度乘法的常数因子内。

对于大数,最容易实施的除法算法是移位和减法

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
移位不必是字面上的。例如,您可以编写一个算法,将左移的值从另一个值中减去,而不是在减去之前实际将整个值向左移动。比较也是如此


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

“因为这是一个赋值”。。。添加家庭作业标签?如果你能在纸上做长除法,你已经知道解决这个问题的好算法了。@Neil:我不希望收到代码示例。我只是希望学习一些数学技巧来超越这些语言限制。@pocoa:那么你应该添加家庭作业标签。标签表示你需要帮助/想法/建议,但你不想为自己完成工作。@Carl:我认为当你需要将120位数字除以75:)这就是为什么我要问的原因。很久以前,我在MP图书馆读源代码(我想)。它使用这种方法处理“中等大小”的数字(大于长,小于约30字节),然后切换到傅里叶除法处理非常大的数字。我很想知道这是否仍然是使用的方法。@rschuler:所以傅里叶除法算法可以解决这个问题,对吗?你的解只对小除数有用。当除数也是一个大数字时,情况要复杂得多。是的,如果我找不到更好的算法,我将实现我自己的:)限制你搜索“更好”算法的时间。在等待答案时执行小学算法。:-)@托马斯:哈哈。。也许这就是答案!:)谢谢提醒!谷歌;你会在网上找到很多关于Knuth久负盛名地记录的算法“改进”的论文。@pocoa,你真的应该从你学校的图书馆得到它,这是一本好书。有没有人碰巧有Knuth算法D的1对1幼稚但有效的C语言实现?我被多个步骤弄糊涂了,比如D1引入新的数字u_Um(m+n),如果d=1,则应将其设置为0,否则呢?在步骤D4中,如果任何数字<0,我是否应该将b^(n+1)添加到所有数字?我要添加到左边的借条,应该是1吗?我的大脑也很难取代你。D6为什么会有一个0乘以v_1;(n-1)?我完全明白,我实在太轻巧了,无法理解他。我发现了很多优化等。