添加整数没有多头

时间:2013-11-10 23:14:28

标签: c++ math integer long-integer largenumber

我正在写一个类来模拟大整数。我将数据作为无符号整数存储在一个名为data的向量指针中。这个函数的作用是将n加到当前的大整数。似乎减慢我的表现的是必须使用长期值。你们中的任何人都知道解决这个问题吗?我目前不得不长期付款,否则它会溢出。

void Integer::u_add(const Integer & n)
{
    std::vector<unsigned int> & tRef = *data;
    std::vector<unsigned int> & nRef = *n.data;
    const int thisSize = tRef.size();
    const int nSize = nRef.size();
    int carry = 0;
    for(int i = 0; i < nSize || carry; ++i)
    {
        bool readThis = i < thisSize;
        long long sum = (readThis ? (long long)tRef[i] + carry : (long long)carry) + (i < nSize ? nRef[i] : 0);
        if(readThis)
            tRef[i] = sum % BASE; //Base is 2^32
        else
            tRef.push_back(sum % BASE);
        carry = (sum >= BASE ? 1 : 0);
    }
}

还想知道使用指针本身对指针的引用是否有任何好处?我的意思是我应该使用tRef [i]或(* data)[i]来访问数据。

1 个答案:

答案 0 :(得分:1)

使用base 2 ^ 30而不是使用base 2 ^ 32。然后当你添加两个值时,最大的总和将是2 ^ 31-1,它适合普通的long(有符号或无符号)。

或者更好的是,使用10 ^ 9(大约等于2 ^ 30),然后您不需要花费太多精力以十进制格式打印大数字。


如果你真的需要在base 2 ^ 32中工作,你可以试试像下面这样的kludge,前提是unsigned int不会抛出溢出异常:

sum = term1 + term2
carry = 0
if (sum < term1 || sum < term2)
    carry = 1