gpt4 book ai didi

c++ - Bigint +运算符

转载 作者:行者123 更新时间:2023-11-30 03:03:49 27 4
gpt4 key购买 nike

我正在做一个 bigint 项目,我很困惑为什么我的加法运算符在测试用例上不能正常工作。

我排除了 .h 文件,因为它可能没有必要。

bigint.cpp

#include "bigint.h"
#include<iostream>
#include<fstream>
#include<cstdlib>
#include<cassert>



bigint::bigint()
{ //Default constructor that sets digit to ZERO
for (int i = 0; i < MAX; i++)
{
digits[i] = 0;
}
}


bigint::bigint(int n)
{

for(int i = 0; i < MAX; ++i) //Sets the digit to ZERO
digits[i] = 0;

for (int i = 0; n != 0 ; ++i)
{
digits[i] = (n % 10); //
n = n / 10;
}


}


bigint::bigint(const char new_digits[])
{
int null = 0;
int temp = 0;

for(int i = 0; i < MAX; ++i)
{
digits[i] = 0;
}

while(new_digits[null] != '\0')
++null;
--null;
temp = null;

for(int j = 0; j < MAX && temp >= 0; ++j)
{
digits[j] = new_digits[temp] - '0';
temp -= 1;
}
}


bool bigint::operator==(const bigint& equal) const
{
int i = 0;

while(i < MAX)
{
if(digits[i] != equal.digits[i])
{
return false;
}

++i;
}
return true;
}


std::ostream& operator<<(std::ostream& output, const bigint& source)
{

int sub1 = MAX - 1; //subtracts 1 from the maximum size

while(source.digits[sub1] == 0)
{
--sub1; //EMPTY
}

while(sub1 > -1)
{
output << source.digits[sub1];
--sub1;
}

std::cout << std:: endl;

return output;
}

std::istream& operator>>(std::istream& in, bigint& source)
{
char getdata[MAX];
char user_input;
int i = 0;



in.get(user_input);
while(!in.eof() && user_input != ';')
{
in.get(user_input);
source.digits[i] = user_input;
++i;
}

source = bigint(getdata);

return in;
}

char bigint::operator[](const int i)
{
return digits[i];
}

bigint bigint::operator+(const bigint rhs)
{
bigint result;
int i = 0;

for( ; i < MAX; ++i)
{

if((digits[i] + rhs.digits[i]) > 9)
{
digits[i+1] = digits[i+1] + 1 ;


}

result.digits[i] = (digits[i] + rhs.digits[i]);
result.digits[i] = result.digits[i] % 10;
}

return result;




}

Main.cpp(测试用例)

int main()
{
// Setup fixture
bigint left("1");
bigint right("9");
bigint result;

// Test
result = (left + right);

Verify
assert(left == "1");
assert(right == "9");
assert(result == "10");

}

在此测试用例中,程序在 assert(result == "10"); 时中止;

但是如果我有相同的测试用例,除了 assert(result == 10);程序运行。

谁能说说为什么?

最佳答案

首先,您应该实现赋值运算符 bigint::operator=(const bigint&)

现在,在 operator+ 中,您正在更改左侧对象的内容,在这段代码中:

if((digits[i] + rhs.digits[i]) > 9)
{
digits[i+1] = digits[i+1] + 1 ;
}

这样不好。例如,如果您运行此代码:

bigint x("5");
bigint y("6");

x+y;
x+y;

你最终会得到 x 为 17。

接下来,您将通过 valuebigint::operator 参数传递,您可能应该通过 reference 传递( &).

最后,你这里的缩进是恶意的:

while(new_digits[null] != '\0')
++null;
--null;

这里的循环体是什么?没错,不是第三行。请不要那样缩进代码,它会让小猫哭泣。编程小猫,至少。

注意:我在这里没有看到任何动态内存分配代码,这意味着 digits 可能是一个静态大小的数组。如果您要这样做,请确保它足够大,请注意,如果超出其尺寸,您会损坏。

关于c++ - Bigint +运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9154792/

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