gpt4 book ai didi

C++ 将大数与运算符重载相加

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:30:32 26 4
gpt4 key购买 nike

我是 C++ 的新手,正在尝试创建一个“BigInt”类。我决定将大部分实现基于将数字读入 vector 。

到目前为止,我只为输入字符串编写了复制构造函数。

Largenum::Largenum(std::string input)
{
for (std::string::const_iterator it = input.begin(); it!=input.end(); ++it)
{
number.push_back(*it- '0');
}
}

我遇到的问题是加法函数。我创建了一个函数,在我测试了几次之后它似乎可以工作,但是正如你所看到的那样效率非常低。我有 2 个不同的载体,例如:

std::vector<int> x = {1,3,4,5,9,1};
std::vector<int> y = {2,4,5,6};

我想解决这个问题的方法是在较短的 vector 之前添加 0,在本例中是 y vector ,使两个 vector 具有相同的大小,例如:

x = {1,3,4,5,9,1};
y = {0,0,2,4,5,6};

然后使用基本样式添加来添加它们。

我不想在 vector Y 的前面添加 0,因为如果数字很大,速度会很慢。我目前的解决方案是反转 vector ,然后 push_back 适当数量的 0,然后将其反转回来。这可能比简单地插入前面看起来要慢,我还没有测试过。

问题是,在我对 vector 进行所有加法并将结果 push_back 之后。我留下了一个反向 vector ,我需要再次使用反向!必须有比我的方法更好的方法,但我一直在寻找它。理想情况下,我也会制作 A const。这是函数的代码:

Largenum Largenum::operator+(Largenum &A)
{
bool carry = 0;
Largenum sum;

std::vector<int>::size_type max = std::max(A.number.size(), this->number.size());
std::vector<int>::size_type diff = std::abs (A.number.size()-this->number.size());

if (A.number.size()>this->number.size())
{
std::reverse(this->number.begin(), this->number.end());
for (std::vector<int>::size_type i = 0; i<(max-diff); ++i) this->number.push_back(0);
std::reverse(this->number.begin(), this->number.end());
}
else if (this->number.size() > A.number.size())
{
std::reverse(A.number.begin(), A.number.end());
for (std::vector<int>::size_type i = 0; i<(max-diff); ++i) A.number.push_back(0);
std::reverse(A.number.begin(), A.number.end());
}
for (std::vector<int>::size_type i = max; i!=0; --i)
{
int num = (A.number[i-1] + this->number[i-1] + carry)%10;
sum.number.push_back(num);
(A.number[i-1] + this->number[i-1] + carry >= 10) ? carry = 1 : carry = 0;
}
if (carry) sum.number.push_back(1);

reverse(sum.number.begin(), sum.number.end());

return sum;
}

如果有人有任何意见,那将是很棒的,这是我的第一个使用 C++ 中的类的程序,它相当压倒性。

最佳答案

我认为您的功能非常接近我所见过的最佳功能。这里还有一些如何改进它的建议:

  • 十进制数字系统效率很低,大数字有很多位。最好使用更高的基数来减少必须添加的位数。以人类可读的形式读写此类数字会有点困难,但您将多次优化操作,因为您的数字会更少。
  • 当实现大整数时,我以相反的顺序表示它们,因此我在索引 0 的位置有最低有效位,而在数组末尾有最高有效位。这样,当进位迫使您添加一个新数字时,您只会执行 push_back,而不是完全相反。

关于C++ 将大数与运算符重载相加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17193056/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com