用大整数除以大整数

时间:2010-06-21 09:41:56

标签: c++ biginteger division

伙计们我正在上课,叫做LINT(大型int),用于学习目的,一切顺利,直到知道。我坚持实现operator /(const LINT&)。这里的问题是,当我想用​​LINT分割LINT时,我正在进行递归fnc调用,即:

//unfinished
LINT_rep LINT_rep::divide_(const LINT_rep& bottom)const
{
typedef LINT_rep::Iterator iter;
 iter topBeg = begin();
 iter topEnd = end();
 iter bottomBeg = bottom.begin();
 iter bottomEnd = bottom.end();
LINT_rep topTmp;//for storing smallest number (dividend) which can be used to divide by divisor
 while (topBeg != topEnd)
 {
  topTmp.insert_(*topBeg);//Number not large enough add another digit
 if (topTmp >= bottom)
 {//ok number >= we can divide 
     LINT_rep topShelf = topTmp / bottom;//HERE I'M RUNNING INTO TROUBLE
 }
 else
 {


 }
 ++topBeg;
 }
 return LINT_rep("-1");//DUMMY
}

我想要做的就是实现这个,好像我会手动划分这些数字,所以例如有一个红利1589和除数27我会这样:

  1. 检查第一个数字是> = divisor,如果是,则除以
  2. 如果没有将第一个数字添加到另一个数字并检查是否> B'/ LI>

    在某些时候它会更大(在简化场景中)如果是这样我必须分开但是在这种情况下我遇到了递归调用而且我不知道如何打破它。
    一个注意事项:作为一个tmp,我必须使用LINT而不是int,例如因为那些数字我不适合int 所以我一般要求的是有没有其他方法来进行划分?或许在我的思考中存在错误的逻辑(很可能)。 谢谢。

2 个答案:

答案 0 :(得分:2)

在做你的部分时(1)你不能分开;你必须重复减去或猜测减去一个倍数,就像你手工完成一样。您可以通过设置所需倍数的上限和下限以及在整个范围内执行二进制切换来更有效地“猜测”。

我自己做过类似的事情;练习运算符重载是一个方便的练习。如果你愿意,我可以提供一段代码,虽然它使用数组和半生不熟的异常,所以我不愿在本网站的专家读者面前提供它。

答案 1 :(得分:0)

首先,请不要在这样的课上工作。使用CGAL的大型int,我认为有一些提升bigint提交,还有大约三到四个其他流行的实现。

其次,此处描述了除法算法:http://en.wikipedia.org/wiki/Long_division

[编辑]正确的方法: 数字k的结果(C): 如果A的第一个数字(左起)称之为A [nA-1]小于B [nB-1],则将零写入C [k]。 k--(转到下一个数字)。 否则,您寻找最大数字C [k],使得C [k] * B * 10 ^ k <= A.这是在循环中完成的。实际上,前一句话就是这一句的私人案例。但它还没有完成。你做A- = C [k] * B * 10 ^ k(否则减去的部分为零)。只有这样,

k--(下一个数字)。循环直到k == 0。

无需递归。只有两个嵌套循环。

k的一个循环(结果的数字),一个循环用于查找每个数字,一个循环(靠近它)用于减法( - =运算符)。