【问题标题】:How to implement bignum addition/multiplication from scratch in C++ [duplicate]如何在 C++ 中从头开始实现 bignum 加法/乘法 [重复]
【发布时间】:2013-03-31 18:21:27
【问题描述】:

我已经开始编写一个 bignum 库,其中包含一个 short 向量来表示值、一个打印函数和负数支持。但是,我找不到实现长加法的好方法,如下所示:

 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)

编辑:它被实现为一个类

【问题讨论】:

  • 加法很简单。您添加数字,如果总和大于单个数字可以容纳,则为下一个位置进行进位。
  • 除非你真的想要base-10数字,bignum库通常使用base-B,其中B=2**ww是(无符号)中的位数整数类型。
  • "什么都不做" 当v.size()1,你看到这个函数做了什么?
  • 当我给它赋值 1 时,它仍然对这个值没有任何作用
  • 进位机制不对

标签: c++ bignum arbitrary-precision


【解决方案1】:

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

其他一些事情:

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

  • i&gt;0 应该是i&gt;=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;
    }
}

【讨论】:

  • 是的,我有一个叫做 v 的向量,但为了清楚起见,我把它改成了向量
  • 我不能按原样放入i>=0,因为i是无符号的,会导致段错误,所以我把i改成有符号
  • 感谢您的建议,现在 1+1 有效!现在正在努力携带...
  • 在 bignum 类中
猜你喜欢
  • 1970-01-01
  • 2011-01-16
  • 2011-08-25
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
相关资源
最近更新 更多