1
- /* *
1
+ /*
2
2
* Description: BigInt (Big Integer library)
3
3
* Usage: See constructors, operators like +, -, *, /, >, >=, <, <=, ==, toString
4
4
* Note: Remove references '&' in overloaded operators for chaining operations.
@@ -49,7 +49,7 @@ class Bigint {
49
49
50
50
// Put everything back to original state
51
51
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 ' ;
53
53
54
54
return len;
55
55
}
@@ -83,22 +83,22 @@ class Bigint {
83
83
}
84
84
85
85
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
102
102
bool equals (char *X, int lenX, char *Y, int lenY) {
103
103
int maxLen = max (lenX, lenY);
104
104
align (X, maxLen); align (Y, maxLen);
@@ -115,8 +115,9 @@ class Bigint {
115
115
bool greater (char *X, int lenX, char *Y, int lenY) {
116
116
int maxLen = max (lenX, lenY);
117
117
align (X, maxLen); align (Y, maxLen);
118
- for (int i = maxLen; i >= 0 ; i--) {
118
+ for (int i = maxLen - 1 ; i >= 0 ; i--) {
119
119
if (X[i] > Y[i]) return true ;
120
+ if (X[i] < Y[i]) return false ;
120
121
}
121
122
122
123
// Put everything back to original state
@@ -181,13 +182,13 @@ class Bigint {
181
182
return modulo;
182
183
}
183
184
184
- // Logical Operators
185
+ // Relational Operators
185
186
bool operator ==(Bigint &b) {
186
187
return equals (this ->x , this ->length , b.x , b.length );
187
188
}
188
189
189
190
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 );
191
192
}
192
193
193
194
bool operator >=(Bigint &b) {
@@ -212,7 +213,10 @@ class Bigint {
212
213
string toString () {
213
214
string s (x, x+length);
214
215
reverse (s.begin (), s.end ());
215
- return trimZeros (s);
216
+ s = trimZeros (s);
217
+ if (s.length () == 0 )
218
+ return " 0" ;
219
+ return s;
216
220
}
217
221
218
222
friend std::ostream& operator <<(ostream &o, Bigint v) {
@@ -225,10 +229,13 @@ int main() {
225
229
Bigint A (" 123456789" ); // Construct Bigint using string representation
226
230
Bigint B (987654321 ); // Construct Bigint using integer representation
227
231
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;
231
237
// logical operations
232
238
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;
234
241
}
0 commit comments