我正在写一个类来模拟大整数。我将数据作为无符号整数存储在一个名为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]来访问数据。
答案 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