添加不带长整型的整数

Adding Integers without longs

本文关键字:整数 长整型 添加      更新时间:2023-10-16

我正在编写一个类来建模大整数。 我将我的数据存储为无符号整数存储在称为 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] 来访问数据。

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

或者更好的是,使用基数 10^9(大致等于 2^30),这样你就不需要花费很多精力来打印十进制格式的大数字。


如果你真的需要在 base 2^32 中工作,你可以尝试如下方法,前提是unsigned int不会引发溢出异常:

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