如何在C ++中从头开始实现bignum加法/乘法

时间:2013-03-31 18:21:28

标签: c++ bignum arbitrary-precision

我已经开始编写一个bignum库,带有一个短裤矢量来表示值,打印功能和负数支持。但是,我找不到实现长时间添加的好方法,如下所示:

 123
+123
----
 246

我有的最新代码没有给出段错误:

void add(unsigned long long b)
    {   
        for(long long i=v.size()-1;i>=0;--i)
        {
            if((b+v[i])<10)
                v[i]+=b;
            else // Carry
                {
                    if(i==0) // 1st digit
                    {
                        v.push_front(1); // Can't be more than 1
                    }
                    else
                        v[i-1]++; // Increment digit to the left
                }

        }
    }

,但添加携带不正确(10 + 1为21)

编辑:它是作为一个类实现的

1 个答案:

答案 0 :(得分:0)

考虑将11传递给函数:
如果vector[i]&gt; = 0,则b+vector[i]&gt; 11,因此b+vector[i]<10永远不会成真。

其他一些事情:

  • 您正在使用vectorv,我很确定只应该有一个。

  • i>0应为i>=0,否则循环会跳过第一个元素。

  • 让每个元素代表一个数字有点矫枉过正。您可以让每个元素代表0-65535(无符号短整数范围)。只需在下面更改10到65535。或者0-10000也可能有意义,因为分解成数字会更简单。

  • 该函数不应该包含BigNum类的参数吗?

  • 从第一个到最后一个元素的循环会更有意义。

更好的(未经测试的)add函数可能如下所示:

const int BASE = 10;
void add(unsigned long long b)
{
    for (int i = 0; b > 0 && i < v.size(); ++i)
    {
        unsigned long long val = b + v[i];
        b = val / BASE;
        v[i] = val % BASE;
    }
    // if adding more digits
    while (b > 0)
    {
        v.push_back(b % BASE);
        b /= BASE;
    }
}