Big Int实现,如何处理前导零?

时间:2016-12-14 03:30:55

标签: c++ biginteger bigint

在我学习如何制作一个大整数课程的过程中,我还遇到了另一个问题。这次我知道事情是如何工作的,除了一个简单的大问题外,它们还能正常工作:我如何处理前导零?

示例:想象我有一个int向量,我决定每个int每个只能有3个数字,从而使1000溢出的限制。如果我总和445和555我得到1000,那么我减去1000我得到0和一个1的进位。我的问题是,我怎么代表000?

我考虑过将一个字符串成员添加到我的类中:想法是将数字转换为字符串,比较它们的大小,更新字符串然后添加前导零。但是,我不知道这个解决方案有多好。

总而言之,您对我迄今取得的成就有何想法?

    // Input strings:
    // 73864783264783264738264738246387246827364872364
    // 744444444432432424234234324234344346

    std::list<long long unsigned> data;        

    void split(std::string p_input) {
        if (p_input.back() == '-') {
            p_input.pop_back();
            positive = !positive;
        }
        reverse(begin(p_input), end(p_input));
        for (size_t i {}; i < p_input.size(); i += 19) {
            std::string qq {p_input.substr(i, 19)};
            reverse(begin(qq), end(qq));
            data.push_front(stoull(qq));
        }
    }

    big_int & operator +=(big_int & p_input) {
        if (data.size() < p_input.data.size()) {
            std::swap(data, p_input.data);
        }
        if (p_input.data.size() != data.size()) {
            size_t size {data.size() - 1};
            while (size != 0) {
                p_input.data.push_front(0);
                --size;
            }
        }

// 73 864 783 265 527 709 182 697 170 670 621 481 151 599 216 710
// 73 864 783 265 527 709 182 697 170 67  621 481 151 599 216 710
//                                      ^
//                                      Best way to fix missing zero/s?
        auto arit {rbegin(data)};
        auto brit {rbegin(p_input.data)};
        unsigned carry {};
        while (arit != rend(data)) {
            long long unsigned result {*arit + *brit + carry};
            if (result >= 10000000000000000000) {
                *arit = result - 10000000000000000000;
                carry = 1;
            } else {
                *arit = result;
                carry = 0;
            }
            ++arit;
            ++brit;
        }
        return *this;
    }

0 个答案:

没有答案