AALanguage
The best language for those who have nothing to do
Loading...
Searching...
No Matches
Large.cpp
Go to the documentation of this file.
1#include "Large.h"
2
4 num = "0";
6}
7large::large(std::string value) {
8 bool ok = true;
9 num = value;
10 sign = value[0] == '-' ? Sign::Minus : Sign::Plus;
11 if (value[0] == '-' || value[0] == '+')
12 num.erase(0, 1);
13 for (int i = 0; i < num.size(); ++i) {
14 ok &= num[i] >= '0' && num[i] <= '9';
15 }
16 if (!ok)
17 throw std::exception("Cannot cast not an integer std::string to large");
18}
19large::large(long long value) {
20 num = std::to_string(value);
21 sign = value < 0 ? Sign::Minus : Sign::Plus;
22 if (sign == Sign::Minus)
23 num.erase(0, 1);
24}
25std::string large::GetNum() {
26 return num;
27}
29 return *this = (*this + value);
30}
32 return *this = (*this - value);
33}
35 return *this = (*this * value);
36}
38 return *this = (*this / value);
39}
41 return *this = (*this % value);
42}
44 auto tmp = *this;
45 *this += large(1);
46 return tmp;
47}
49 auto tmp = *this;
50 *this -= large(1);
51 return tmp;
52}
54 return *this += large(1);
55}
57 return *this -= large(1);
58}
60 return large(0) - *this;
61}
63 std::string num1 = num, num2 = val.GetNum();
64 return num1 == num2;
65}
67 return !(*this == val);
68}
70 return *this < val || *this == val;
71}
73 return *this < val == false;
74}
76 return *this >= val && *this != val;
77}
79 if (val.sign != sign)
80 return sign == Sign::Minus;
81 bool isMinus = val.sign == Sign::Minus;
82 std::string num1 = num, num2 = val.GetNum();
83 if (num1.length() != num2.length())
84 return isMinus ? num1.length() > num2.length() : num1.length() < num2.length();
85 else if (num1 == num2)
86 return false;
87 for (int i = 0; i < num1.length(); i++) {
88 if (num1[i] != num2[i])
89 return isMinus ? num1[i] > num2[i] : num1[i] < num2[i];
90 }
91}
93 if (val.sign != sign)
94 return val.sign == Sign::Plus ? val - large(num) : large(num) - large(val.GetNum());
95 bool isMinus = val.sign == Sign::Minus;
96 std::string num2 = val.GetNum(), num1 = num;;
97 reverse(num1.begin(), num1.end());
98 reverse(num2.begin(), num2.end());
99 int carry = 0, n = std::max(num1.length(), num2.length()) + 1;
100 num1 += std::string(n - num1.length(), '0');
101 num2 += std::string(n - num2.length(), '0');
102 std::string ans = std::string(n, '0');
103 for (int i = 0; i < n; i++) {
104 ans[i] += num1[i] + num2[i] - 2 * '0';
105 if (ans[i] > '9') {
106 ans[i + 1]++;
107 ans[i] -= 10;
108 }
109 }
110 if (ans[n - 1] == '0') ans.erase(n - 1, 1);
111 reverse(ans.begin(), ans.end());
112 if (isMinus)
113 ans = "-" + ans;
114 return large(ans);
115}
117 if (sign == Sign::Minus && val.sign == Sign::Plus)
118 return large("-" + val.GetNum()) + *this;
119 else if (sign == Sign::Plus && val.sign == Sign::Minus)
120 return *this + large(val.GetNum());
121 else if (sign == Sign::Minus && val.sign == Sign::Minus)
122 return large(val.GetNum()) - large(num);
123 std::string num1 = num, num2 = val.GetNum();
124 if (num1 == num2) {
125 return large(0);
126 }
127 bool isMunus = val > *this;
128 if (isMunus)
129 swap(num1, num2);
130 reverse(num1.begin(), num1.end());
131 reverse(num2.begin(), num2.end());
132 std::string ans = std::string(num1.length(), '0');
133 num2 += std::string(num1.length() - num2.length(), '0');
134 for (int i = 0; i < num1.length(); i++) {
135 ans[i] += num1[i] - num2[i];
136 if (ans[i] < '0') {
137 ans[i] += 10;
138 ans[i + 1]--;
139 }
140 }
141 reverse(ans.begin(), ans.end());
142 int i = 0;
143 while (ans[i] == '0') i++;
144 return large((isMunus ? "-" : "") + ans.substr(i));
145}
147 bool isMinus = val.sign != sign;
148 std::string num1 = num, num2 = val.GetNum();
149 large ans;
150 if (num1 == "0" || num2 == "0")
151 return large(0);
152 if (num2.length() > 1) {
153 std::vector<large> nums;
154 for (int i = num2.length() - 1; i >= 0; i--) {
155 nums.push_back(*this * large(num2.substr(i, 1)));
156 if (nums[num2.length() - 1 - i] != large(0))
157 nums[num2.length() - 1 - i] = large(nums[num2.length() - 1 - i].GetNum() + std::string(num2.length() - 1 - i, '0'));
158 }
159 for (int i = 0; i < nums.size(); i++) ans += nums[i];
160 return large((isMinus ? "-" : "") + ans.GetNum());
161 } else {
162 for (int i = 0; i < atoi(num2.c_str()); i++)
163 ans = ans + *this;
164 return large((isMinus ? "-" : "") + ans.GetNum());
165 }
166}
167large large::operator/ (long long val) {
168 bool isMinus = val >= 0 != sign == Sign::Plus;
169 std::string num1 = num, num2 = std::to_string(val), ans = "";
170 val = abs(val);
171 long long tmp, i = 1;
172 for (; (i < num1.length()) && (tmp = atoi(num1.substr(0, i).c_str()), tmp < val); i++) {}
173 tmp = atoi(num1.substr(0, i).c_str());
174 bool moved = false;
175 if (val > tmp)
176 return large(0);
177 else {
178 ans += std::to_string(tmp / val);
179 tmp = tmp % val;
180 num1.erase(0, i);
181 while (num1.length() > 0) {
182 if (tmp == 0 && num1 == std::string(num1.length(), '0'))
183 return large(ans + num1);
184 if (tmp != 0) {
185 tmp *= 10;
186 tmp += atoi(num1.substr(0, 1).c_str());
187 num1.erase(0, 1);
188 ans += std::to_string(tmp / val);
189 tmp = tmp % val;
190 } else {
191 ans += std::to_string(atoi(num1.substr(0, 1).c_str()) / val);
192 tmp = atoi(num1.substr(0, 1).c_str()) % val;
193 num1.erase(0, 1);
194 }
195 }
196 }
197 return large((isMinus ? "-" : "") + ans);
198}
200 if (val.GetNum() == "0")
201 throw std::exception("Division by zero");
202 bool isMinus = val.sign != sign;
203 std::string num1 = num, num2 = val.GetNum();
204 large L = large(0), R = large(num1), m;
205 while (L < R - large(1)) {
206 m = L + (R - L) / 2;
207 if (m * large(num2) >= large(this->num)) R = m;
208 else L = m;
209 }
210 if (R * large(num2) > large(this->num))
211 R -= large(1);
212 return large((isMinus && R != large(0) ? "-" : "") + R.GetNum());
213}
215 bool isMinus = val.sign != sign;
216 val = large(val.GetNum());
217 auto ans = large(this->num) - large(this->num) / val * val;
218 return (isMinus && ans != large(0) ? "-" : "") + ans.GetNum();
219}
220std::string large::ToString() {
221 return (sign == Sign::Minus ? "-" : "") + num;
222}
224 large res = 1, a = *this;
225 while (val != 0) {
226 if ((val.num.back() - '0') % 2)
227 res *= a;
228 a *= a;
229 val /= 2;
230 }
231 return res;
232}