在我学习如何制作一个大整数课程的过程中,我还遇到了另一个问题。这次我知道事情是如何工作的,除了一个简单的大问题外,它们还能正常工作:我如何处理前导零?
示例:想象我有一个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;
}