-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBiginteger.cpp
More file actions
132 lines (103 loc) · 3.53 KB
/
Biginteger.cpp
File metadata and controls
132 lines (103 loc) · 3.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
class BigInteger {
private:
string integer;
public:
BigInteger(unsigned int integer);
BigInteger(string integer);
void setInteger(unsigned int integer);
void setInteger(string integer);
unsigned int getIntValue() const;
string toString() const;
BigInteger addInteger(const BigInteger& integer_to_add) const;
BigInteger addInteger(const string& integer_to_add) const;
BigInteger multiplyInteger(const BigInteger& integer_to_multiply) const;
BigInteger multiplyInteger(const string& integer_to_multiply) const;
static size_t getTrimIndex(const string& integer);
bool operator==(const BigInteger& integer) const;
BigInteger operator+(const BigInteger& integer) const;
BigInteger operator*(const BigInteger& integer) const;
friend ostream& operator<<(ostream& in, BigInteger& integer);
};
BigInteger::BigInteger(unsigned int integer) {
setInteger(integer);
}
BigInteger::BigInteger(string integer) {
for (int i = 0; i < (int)integer.size() && integer[i] >= '0' && integer[i] <= '9'; i++) {
this->integer += integer[i];
}
if (this->integer.size() == 0) {
this->integer = "0";
} else {
this->integer = integer.substr(getTrimIndex(integer));
}
}
void BigInteger::setInteger(unsigned int integer) {
if (integer == 0) this->integer = "0";
while (integer) {
this->integer = (char)((integer % 10) + '0') + this->integer;
integer /= 10;
}
}
void BigInteger::setInteger(string integer) {
this->integer = integer;
}
string BigInteger::toString() const {
return integer;
}
BigInteger BigInteger::addInteger(const BigInteger& integer_to_add) const {
int a_n = max((int)(integer_to_add.toString().size() - toString().size()), 0);
int b_n = max((int)(toString().size() - integer_to_add.toString().size()), 0);
string a = string(a_n, '0') + toString();
string b = string(b_n, '0') + integer_to_add.toString();
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
string result; int carry = 0;
for (int i = 0; i < (int)a.size(); i++) {
int sum = (a[i] - '0') + (b[i] - '0') + carry;
result += ((char)(sum % 10 + '0'));
carry = sum / 10;
}
if (carry != 0) result += ((char)(carry + '0'));
reverse(result.begin(), result.end());
return BigInteger(result.substr(getTrimIndex(result)));
}
BigInteger BigInteger::addInteger(const string& integer_to_add) const {
return addInteger(BigInteger(integer_to_add));
}
size_t BigInteger::getTrimIndex(const string& integer) {
size_t index = 0;
while (integer[index] == '0' && index < integer.size() - 1) index++;
return index;
}
BigInteger BigInteger::multiplyInteger(const BigInteger& integer_to_multiply) const {
string a = integer_to_multiply.toString();
string b = toString();
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
BigInteger ret("0");
for (int i = 0; i < (int)a.size(); i++) {
int carry = 0; string tmp = string(i, '0');
for (int j = 0; j < (int)b.size(); j++) {
int mul = (a[i] - '0') * (b[j] - '0') + carry;
tmp += ((char)(mul % 10 + '0'));
carry = mul / 10;
}
if (carry != 0) tmp += (carry + '0');
reverse(tmp.begin(), tmp.end());
ret = ret.addInteger(tmp.substr(getTrimIndex(tmp)));
}
return ret;
}
BigInteger BigInteger::multiplyInteger(const string& integer_to_multiply) const {
return multiplyInteger(BigInteger(integer_to_multiply));
}
BigInteger BigInteger::operator+(const BigInteger& integer) const {
return addInteger(integer);
}
BigInteger BigInteger::operator*(const BigInteger& integer) const {
return multiplyInteger(integer);
}
ostream& operator<<(ostream& in, BigInteger& integer) {
in << integer.toString();
return in;
}