Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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

Lines changed: 33 additions & 26 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /