Advertisement
a53

Numere Mari

a53
Sep 23rd, 2022
280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.98 KB | None | 0 0
  1. // indentare cu 2 spatii pentru ca sursa cu 3 spatii trece de 10KB =[
  2. class big_int
  3. {
  4. private:
  5. int sign; // -1 daca numarul este negativ, +1 daca este pozitiv
  6. string digits; // cifrele numarului, stocate in ordine inversa
  7.  
  8. public:
  9. // initializare implicita cu 0
  10. big_int()
  11. {
  12. digits = "0";
  13. sign = 1;
  14. }
  15.  
  16. // initializare prin intermediul unui sir de caractere
  17. big_int(string s)
  18. {
  19. int i;
  20. if (s.front() == '-')
  21. sign = -1, i = 1;
  22. else if (s.front() == '+')
  23. sign = 1, i = 1;
  24. else
  25. sign = 1, i = 0;
  26.  
  27. for (int j = s.size() - 1; j >= i; --j)
  28. digits.push_back(s[j]);
  29. }
  30.  
  31. // initializare prin intermediul unui caracter
  32. big_int(char c)
  33. {
  34. sign = 1;
  35. digits.push_back(c);
  36. }
  37.  
  38. // initializare prin intermediul unui numar intre -2^31 si 2^31 - 1
  39. big_int(int n)
  40. {
  41. if (n < 0)
  42. sign = -1;
  43. else
  44. sign = 1;
  45.  
  46. n = std::abs(n);
  47. do {
  48. digits.push_back(n%10 + '0');
  49. n /= 10;
  50. } while (n);
  51. }
  52.  
  53. // conversie la sir de caractere
  54. operator string() const
  55. {
  56. string ans;
  57.  
  58. if (sign == -1)
  59. {
  60. ans.resize(1 + digits.size());
  61. ans.front() = '-';
  62. reverse_copy(digits.begin(), digits.end(), ans.begin() + 1);
  63. return ans;
  64. }
  65. else
  66. {
  67. ans.resize(digits.size());
  68. reverse_copy(digits.begin(), digits.end(), ans.begin());
  69. return ans;
  70. }
  71. }
  72.  
  73. // comparator ==
  74. friend bool operator == (const big_int& a, const big_int& b)
  75. {
  76. return (a.sign == b.sign && a.digits == b.digits);
  77. }
  78.  
  79. // comparator <
  80. friend bool operator < (const big_int& a, const big_int& b)
  81. {
  82. if (a.sign == -1 && b.sign == 1)
  83. return true;
  84.  
  85. if (a.sign == 1 && b.sign == -1)
  86. return false;
  87.  
  88. if (a.sign == -1 && b.sign == -1)
  89. return (b.abs() < a.abs());
  90.  
  91. if (a.sign == 1 && b.sign == 1)
  92. {
  93. if (a.digits.size() < b.digits.size())
  94. return true;
  95.  
  96. if (a.digits.size() > b.digits.size())
  97. return false;
  98.  
  99. for (int i = a.digits.size() - 1; i >= 0; --i)
  100. if (a.digits[i] < b.digits[i])
  101. return true;
  102. else if (a.digits[i] > b.digits[i])
  103. return false;
  104.  
  105. return false;
  106. }
  107. }
  108.  
  109. // comparator <=
  110. friend bool operator <= (const big_int& a, const big_int& b)
  111. {
  112. return (a < b || a == b);
  113. }
  114.  
  115. // comparator >=
  116. friend bool operator >= (const big_int& a, const big_int& b)
  117. {
  118. return !(a < b);
  119. }
  120.  
  121. // valoarea absoluta
  122. big_int abs() const
  123. {
  124. big_int ans = *this;
  125. ans.sign = 1;
  126.  
  127. return ans;
  128. }
  129.  
  130. // opusul (inversul in raport cu adunarea)
  131. big_int operator - () const
  132. {
  133. if (digits == "0")
  134. return *this;
  135.  
  136. big_int ans = *this;
  137. ans.sign *= -1;
  138. return ans;
  139. }
  140.  
  141. // suma a 2 numere
  142. big_int operator + (const big_int& b) const
  143. {
  144. if (sign == -1 && b.sign == -1)
  145. return -(this->abs() + b.abs());
  146.  
  147. if (sign == -1 && b.sign == 1)
  148. return b - this->abs();
  149.  
  150. if (sign == 1 && b.sign == -1)
  151. return *this - b.abs();
  152.  
  153. if (sign == 1 && b.sign == 1)
  154. {
  155. big_int ans;
  156. ans.sign = 1;
  157. ans.digits = "";
  158.  
  159. int cnt = 0, i;
  160. for (i = 0; i < std::min(digits.size(), b.digits.size()); ++i)
  161. {
  162. int sum = digits[i]-'0' + b.digits[i]-'0' + cnt;
  163. ans.digits.push_back(sum%10 + '0');
  164. cnt = sum/10;
  165. }
  166.  
  167. for (; i < digits.size(); ++i)
  168. {
  169. int sum = digits[i]-'0' + cnt;
  170. ans.digits.push_back(sum%10 + '0');
  171. cnt = sum/10;
  172. }
  173.  
  174. for (; i < b.digits.size(); ++i)
  175. {
  176. int sum = b.digits[i]-'0' + cnt;
  177. ans.digits.push_back(sum%10 + '0');
  178. cnt = sum/10;
  179. }
  180.  
  181. for (; cnt; cnt /= 10)
  182. ans.digits.push_back(cnt%10 + '0');
  183.  
  184. return ans;
  185. }
  186. }
  187.  
  188. // diferenta a 2 numere
  189. big_int operator - (const big_int& b) const
  190. {
  191. if (sign == -1 && b.sign == -1)
  192. return b.abs() - this->abs();
  193.  
  194. if (sign == -1 && b.sign == 1)
  195. return -(this->abs() + b);
  196.  
  197. if (sign == 1 && b.sign == -1)
  198. return *this + b.abs();
  199.  
  200. if (sign == 1 && b.sign == 1)
  201. {
  202. if (*this < b)
  203. return -(b - *this);
  204.  
  205. big_int ans;
  206. ans.sign = 1;
  207. ans.digits = "";
  208. int i;
  209. bool cnt = 0;
  210.  
  211. for (i = 0; i < std::min(digits.size(), b.digits.size()); ++i)
  212. {
  213. if ((digits[i]-'0') - (b.digits[i]-'0') - cnt < 0)
  214. {
  215. ans.digits.push_back((digits[i]-'0') - (b.digits[i]-'0') - cnt + 10 + '0');
  216. cnt = 1;
  217. }
  218. else
  219. {
  220. ans.digits.push_back((digits[i]-'0') - (b.digits[i]-'0') - cnt + '0');
  221. cnt = 0;
  222. }
  223. }
  224.  
  225. for (; i < digits.size(); ++i)
  226. {
  227. if ((digits[i]-'0') - cnt < 0)
  228. {
  229. ans.digits.push_back((digits[i]-'0') - cnt + 10 + '0');
  230. cnt = 1;
  231. }
  232. else
  233. {
  234. ans.digits.push_back((digits[i]-'0') - cnt + '0');
  235. cnt = 0;
  236. }
  237. }
  238.  
  239. while (ans.digits.size() != 1 && ans.digits.back() == '0')
  240. ans.digits.pop_back();
  241.  
  242. return ans;
  243. }
  244. }
  245.  
  246. // produsul a 2 numere
  247. big_int operator * (const big_int& b) const
  248. {
  249. if (*this == big_int(0) || b == big_int(0))
  250. return big_int(0);
  251.  
  252. big_int ans;
  253. if (sign + b.sign == 0)
  254. ans.sign = -1;
  255. else
  256. ans.sign = 1;
  257. ans.digits.resize(digits.size() + b.digits.size(), '0');
  258.  
  259. int cnt, i, j;
  260. for (i = 0; i < digits.size(); ++i)
  261. {
  262. cnt = 0;
  263.  
  264. for (j = 0; j < b.digits.size(); ++j)
  265. {
  266. int sum = (ans.digits[i+j]-'0' + (digits[i]-'0') * (b.digits[j]-'0') + cnt);
  267. ans.digits[i+j] = sum%10 + '0';
  268. cnt = sum/10;
  269. }
  270.  
  271. if (cnt)
  272. ans.digits[i+j] = (ans.digits[i+j]-'0' + cnt) + '0';
  273. }
  274.  
  275. while (ans.digits.size() != 1 && ans.digits.back() == '0')
  276. ans.digits.pop_back();
  277.  
  278. if (ans.digits == "0")
  279. return big_int(0);
  280. return ans;
  281. }
  282.  
  283. // catul impartirii a 2 numere
  284. big_int operator / (const big_int& b) const
  285. {
  286. if (*this == big_int(0))
  287. return big_int(0);
  288.  
  289. big_int ans, A = this->abs(), B = b.abs();
  290.  
  291. if (A < B)
  292. return big_int(0);
  293.  
  294. big_int dei, inm;
  295. dei.digits = "";
  296. ans.digits = "";
  297. int i;
  298. for (i = digits.size() - 1; ; --i)
  299. {
  300. dei.digits.insert(dei.digits.begin(), digits[i]);
  301. if (dei >= B)
  302. break;
  303. }
  304.  
  305. for (i--; i >= -1; --i)
  306. {
  307. for (int j = 0; j <= 9; ++j)
  308. {
  309. inm.digits[0] = j+'0';
  310. if ( !(B * inm <= dei) )
  311. {
  312. inm.digits[0]--;
  313. break;
  314. }
  315. }
  316.  
  317. ans.digits.push_back(inm.digits[0]);
  318. dei = dei - B*inm;
  319. if (dei.digits == "0")
  320. dei.digits = "";
  321.  
  322. if (i >= 0)
  323. dei.digits.insert(dei.digits.begin(), digits[i]);
  324. }
  325.  
  326. if (sign + b.sign == 0)
  327. ans.sign = -1;
  328. else
  329. ans.sign = 1;
  330. reverse(ans.digits.begin(), ans.digits.end());
  331. return ans;
  332. }
  333.  
  334. // restul impartirii a 2 numere pozitive
  335. big_int operator % (const big_int& b) const
  336. {
  337. return *this - *this / b * b;
  338. }
  339.  
  340. // citire prin intermediul stream-urilor
  341. friend istream& operator >> (istream& in, big_int& n)
  342. {
  343. int i;
  344. string nr;
  345. in >> nr;
  346.  
  347. if (nr.front() == '-')
  348. n.sign = -1, i = 1;
  349. else if (nr.front() == '+')
  350. n.sign = 1, i = 1;
  351. else
  352. n.sign = 1, i = 0;
  353.  
  354. if (nr == "-0")
  355. n.sign = +1;
  356.  
  357. n.digits.resize(nr.size() - i);
  358. reverse_copy(nr.begin() + i, nr.end(), n.digits.begin());
  359.  
  360. return in;
  361. }
  362.  
  363. // scriere prin intermediul stream-urilor
  364. friend ostream& operator << (ostream& out, const big_int& n)
  365. {
  366. if (n.sign == -1)
  367. out << '-';
  368.  
  369. for (int i = n.digits.size() - 1; i >= 0; --i)
  370. out << n.digits[i];
  371.  
  372. return out;
  373. }
  374. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement