Skip to content

Commit 8c4682d

Browse files
Merge pull request #13 from WildfootW/master
fix bigint library wrong behavior
2 parents 2d146b2 + d6157a8 commit 8c4682d

File tree

1 file changed

+33
-26
lines changed

1 file changed

+33
-26
lines changed

src/bigint_library.cpp

+33-26
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/**
1+
/*
22
* Description: BigInt (Big Integer library)
33
* Usage: See constructors, operators like +, -, *, /, >, >=, <, <=, ==, toString
44
* Note: Remove references '&' in overloaded operators for chaining operations.
@@ -49,7 +49,7 @@ class Bigint {
4949

5050
//Put everything back to original state
5151
for (int i = 0; i < maxLen; i++) Y[i]=('9'-Y[i])+'0';
52-
X[lenX]='\0'; Y[lenY]='\0';
52+
X[lenX]='\0'; Y[lenY]='\0';
5353

5454
return len;
5555
}
@@ -83,22 +83,22 @@ class Bigint {
8383
}
8484

8585
template<class T>
86-
int divideNmodulo(char *X, int lenX, T divisor, char *Z, T &modulo) {
87-
int remainder = 0;
88-
int size = 0;
89-
for(int i = lenX-1; i >= 0; i--){
90-
remainder *= 10;
91-
remainder += X[i]- '0';
92-
Z[size++] = remainder/divisor + '0';
93-
remainder %= divisor;
94-
}
95-
Z[size]='\0';
96-
reverse(Z, Z+size);
97-
modulo = remainder;
98-
return size;
99-
}
100-
101-
//Logical Operations
86+
int divideNmodulo(char *X, int lenX, T divisor, char *Z, T &modulo) {
87+
int remainder = 0;
88+
int size = 0;
89+
for(int i = lenX-1; i >= 0; i--){
90+
remainder *= 10;
91+
remainder += X[i]- '0';
92+
Z[size++] = remainder/divisor + '0';
93+
remainder %= divisor;
94+
}
95+
Z[size]='\0';
96+
reverse(Z, Z+size);
97+
modulo = remainder;
98+
return size;
99+
}
100+
101+
// Relational Operations
102102
bool equals(char *X, int lenX, char *Y, int lenY) {
103103
int maxLen = max(lenX, lenY);
104104
align(X, maxLen); align(Y, maxLen);
@@ -115,8 +115,9 @@ class Bigint {
115115
bool greater(char *X, int lenX, char *Y, int lenY) {
116116
int maxLen = max(lenX, lenY);
117117
align(X, maxLen); align(Y, maxLen);
118-
for (int i = maxLen; i >= 0; i--) {
118+
for (int i = maxLen - 1; i >= 0; i--) {
119119
if (X[i] > Y[i]) return true;
120+
if (X[i] < Y[i]) return false;
120121
}
121122

122123
//Put everything back to original state
@@ -181,13 +182,13 @@ class Bigint {
181182
return modulo;
182183
}
183184

184-
//Logical Operators
185+
// Relational Operators
185186
bool operator ==(Bigint &b) {
186187
return equals(this->x, this->length, b.x, b.length);
187188
}
188189

189190
bool operator >(Bigint &b) {
190-
return !greater(b.x, b.length, this->x, this->length);
191+
return greater(this->x, this->length, b.x, b.length);
191192
}
192193

193194
bool operator >=(Bigint &b) {
@@ -212,7 +213,10 @@ class Bigint {
212213
string toString() {
213214
string s(x, x+length);
214215
reverse(s.begin(), s.end());
215-
return trimZeros(s);
216+
s = trimZeros(s);
217+
if(s.length() == 0)
218+
return "0";
219+
return s;
216220
}
217221

218222
friend std::ostream& operator<<(ostream &o, Bigint v) {
@@ -225,10 +229,13 @@ int main() {
225229
Bigint A("123456789"); // Construct Bigint using string representation
226230
Bigint B(987654321); // Construct Bigint using integer representation
227231
Bigint C("456789");
228-
cout << A * B << endl; // Overridden ostream
229-
cout << A * B + C << endl; // Chaining operations
230-
cout << (A > B) << endl;
232+
Bigint D("0");
233+
cout << "A * B: " << A * B << endl; // Overridden ostream
234+
cout << "A * B + C: " << A * B + C << endl; // Chaining operations
235+
cout << "(A > B): " << (A > B) << endl;
236+
cout << "D: " << D << endl;
231237
// logical operations
232238
if (A > B) cout << "A is greater than B" << endl;
233-
else cout << "B is greater than A" << endl;
239+
if (B > A) cout << "B is greater than A" << endl;
240+
if (A == B) cout << "A is equal to B" << endl;
234241
}

0 commit comments

Comments
 (0)