BigInteger实现,带有差异

时间:2016-12-12 21:42:03

标签: c++ biginteger bigint

最近,我一直在尝试使用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中得到了相同的结果。

2 个答案:

答案 0 :(得分:1)

如上所述,如果最大幅度的加法携带,则最终递增最低幅度值:

if (carry) {
    vec1.back() += 1;
}

据推测,正确的行为是扩展向量并允许进位占据新的最高值,例如:

if (carry) {
    vec1.insert(vec1.begin(), 1);
}

这意味着您最终会展开vec1(并复制所有现有值,因为在vector开头插入并不便宜),这可能会也可能不正确鉴于您的课程设计(如果vec1vec2的大小不匹配,您的添加操作看起来会不安全,因此不清楚vec1是否允许展开)。

答案 1 :(得分:0)

这个

if (carry) {
    vec1.back() += 1;
}

在最后一个垃圾箱中添加一个。

也许你想在前面插入一个?