添加不带长整型的整数
Adding Integers without longs
我正在编写一个类来建模大整数。 我将我的数据存储为无符号整数存储在称为 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
相关文章:
- C 字符串返回字符串的整数/双精度/长整型值
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- JNI 日期值转换问题,在C++中获取不同的长整型值
- 将长整型值打印为带有前导零的十六进制
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 提升不良词法强制转换:将字符串转换为无符号长整型时,无法将源类型值解释为目标
- 将最小值整数转换为无符号长整型
- 如何将小端格式的QByteArray转换为无符号长整型
- 无符号长整型和无符号 int 之间有什么区别,这 2 种类型应该如何在 c# 中封送?
- 将逗号格式化为长整型整数
- 如何以优雅高效的方式将无符号/有符号整数/长整型转换为 C 字符串?
- 整数溢出 C++ 即使使用“无符号长整型”也是如此
- gdb ptype 打印整数后缀以指示它是有符号的、无符号的、无符号的长整型等
- iOS - 隐式转换将整数精度"size_t"(也称为"无符号长整型")丢失为&
- 添加不带长整型的整数
- 如何将 3 个整数连接成无符号长整型
- 如何将字节数组转换为整数类型(整数、长整型、短型等)"安眠安"?
- 大于无符号长整型的整数类型,以及库
- 在sparcsolaris上使用gcc为长整型整数赋值
- :<built-in>1:2: 警告:使用 C++0x 长整型整数常量 [-Wlong-long]