c++ - 添加没有长整数的整数

标签 c++ math integer long-integer largenumber

我正在编写一个类来模拟大整数。我将我的数据作为无符号整数存储在一个称为数据的 vector 指针中。这个函数的作用是将 n 添加到当前的大整数。似乎减慢我的表现的是必须使用 long long 值。你们中有人知道解决这个问题的方法吗?我目前必须使 sum 变长,否则它会溢出。

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),这样您就不需要花费太多精力以十进制格式打印大数字。


如果您确实需要以 2^32 为基数工作,您可以尝试如下所示的拼凑,前提是 unsigned int 不会抛出溢出异常:

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

关于c++ - 添加没有长整数的整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19896471/

相关文章:

c++ - 如何处理任意大的整数

C++ 枚举等效项 - 转换为常量表达式

c++ - 字符串转整数类型T,检查是否溢出

c++ - 库 c++ 的接口(interface)

c++ - 错误 :Stack around the variable 'hexStr' was corrupted in c++

c++ - 使用鼠标拖动时使用 atan2 旋转图像

ios - 精确的 3D 缩放缩放

ruby - ruby 中的 if 语句,以确定输入类型

java - 无法将整数文件写入java中的文件

python - 用python求解联立多元多项式方程