最近,我一直在尝试使用Big Integer课程。现在,我一直在做一些原型,它们几乎可以工作。这个原型不是一个函数,也不是一个类,只是我做的一个快速的东西,看它是否有效。
到目前为止,这是我的原型:(为了取悦编译器,所有演员看起来有点难看)
std::vector<long long unsigned> vec1 {4294967295, 2294967295, 1294967295};
std::vector<long long unsigned> vec2 {4294967295, 2294967295, 1294967295};
int carry {};
for (int i {static_cast<int>(vec1.size()) - 1}; i != -1; --i) {
int unsigned greater = static_cast<unsigned int>(std::max(vec1[i], vec2[i]));
int unsigned result {};
if (i < static_cast<int>(vec2.size())) {
result = static_cast<int unsigned>(vec2[i] + vec1[i] + carry);
} else if (carry) {
result = static_cast<int unsigned>(vec1[i] + carry);
} else {
break;
}
if (result <= greater) {
vec1[i] += result;
carry = 1;
} else {
vec1[i] = result;
carry = 0;
}
}
if (carry) {
vec1.back() += 1;
}
for (auto const n : vec1) {
cout << n;
}
这就是结果:
858993459025899345892589934591
^ ^
858993459045899345902589934590 -> the correct one!
那么,我做错了什么?
它确实在gcc和visual studio中得到了相同的结果。
答案 0 :(得分:1)
如上所述,如果最大幅度的加法携带,则最终递增最低幅度值:
if (carry) {
vec1.back() += 1;
}
据推测,正确的行为是扩展向量并允许进位占据新的最高值,例如:
if (carry) {
vec1.insert(vec1.begin(), 1);
}
这意味着您最终会展开vec1
(并复制所有现有值,因为在vector
开头插入并不便宜),这可能会也可能不正确鉴于您的课程设计(如果vec1
和vec2
的大小不匹配,您的添加操作看起来会不安全,因此不清楚vec1
是否允许展开)。
答案 1 :(得分:0)
这个
if (carry) {
vec1.back() += 1;
}
在最后一个垃圾箱中添加一个。
也许你想在前面插入一个?