класс — вычитание Bigint в переполнении стека

Здесь у меня есть класс bigint, который использует массив с именем SafeArray, который я создал в другом классе (мы не могли использовать векторы), вызовы функций set и get происходят из класса SafeArray, get принимает параметр int для позиции массива, а set принимает 2 int Параметры (один для позиции и один для значения) все методы в этом классе работают нормально, за исключением моих методов вычитания и сравнения. Что мне действительно нужно для работы, так это мой метод вычитания. Любая помощь? Спасибо

 int size = 20;   //just for testing, will increase later
class bigint
{
SafeArray<int> *arr;
public:
bigint()
{
arr = new SafeArray<int>;
for(int i =0;i < size; i++)
arr->set(i,0);
}

void print()
{
for(int i = 0;i <arr->get_size() ;i++)
{

cout << arr->get(i);

}
cout<<endl;
}

void assign(const bigint &A)
{
for(int i=0;i<arr->get_size();i++)
{
arr->set(i,A.arr->get(i));
}

}

void assign(int num)
{
for(int i = arr->get_size()- 1; i >= 0; i--)
{
arr->set(i,num%10);
num /=10;
}}

void assign(string num)
{
long len = num.length();
int j=arr->get_size()-1;
for(long i=len-1;i>=0;i--)
{
arr->set(j,num[i]-48);
j--;
}
}

void add(const bigint &A)
{

int carry=0;
for(int i=size-1;i>=0;i--)
{
int result = arr->get(i)+A.arr->get(i)+carry;
arr->set(i,result%10);
carry=result/10;}

}

void subtract(const bigint &A) {
for(int i=0, borrow=0; i<size; ++i)

{    int result=((arr->get(i) - A.arr->get(i) + borrow));
if(borrow == result < 0) {
A.arr->set(i,result+=10);
}   }   }

void compare(const bigint & A)
{
//int comp;
//for(int i =0;i<size;i++)
if(arr->get(size-1)>A.arr->get(size-1))
cout<<0;

else
cout<<1;

}
};
int main()
{
bigint A,B,C,D;
A.assign(12345);
A.print();
cout<<endl;
C.assign("123456789000");
C.print();
cout<<endl;
B.add(C);
B.print();
//B.compare(A);
//B.subtract(A);
//B.print();return 0;

}

1

Решение

Я думаю, это должно выглядеть так

void subtract(const bigint &A) {
int borrow = 0;
for(int i=size-1; i >= 0; --i)
{
int result=((arr->get(i) - A.arr->get(i) - borrow));
if(result < 0) {
arr->set(i, result + 10);
borrow = 1;
} else {
arr->set(i, result);
borrow = 0;
}
}
}
// equals A
bool equals(const bigint &A) {
for(int i=0; i < size; ++i) {
if(A.arr->get(i) != arr->get(i)) {
return false;
}
}
return true;
}
// less than A
bool lt(const bigint &A) {
for(int i=0; i < size; ++i) {
if(arr->get(i) != A.arr->get(i)) {
return arr->get(i) < A.arr->get(i);
}
}
}
1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector