Advertisement
Dzham

itoggovno

Jan 5th, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.23 KB | None | 0 0
  1. template<class T>
  2. void delete_zeros(vector<T> &polynom) {
  3. vector<T> result = polynom;
  4. for (size_t i = polynom.size() - 1; i > 0; i--) {
  5. if (result[i] == T()) {
  6. result.pop_back();
  7. } else {
  8. break;
  9. }
  10. }
  11. polynom = result;
  12. }
  13.  
  14. template <typename T>
  15. class Polynomial {
  16. private:
  17. vector<T> polynom;
  18. public:
  19. Polynomial(const vector<T>& pol) {
  20. polynom = pol;
  21. delete_zeros(polynom);
  22. }
  23.  
  24. Polynomial(const T& object) {
  25. polynom.push_back(object);
  26. }
  27.  
  28. template<typename Iter>
  29. Polynomial(const Iter& begin, const Iter& end) {
  30. polynom = vector<T>(begin, end);
  31. delete_zeros(polynom);
  32. }
  33.  
  34. Polynomial() {
  35. polynom.emplace_back();
  36. }
  37.  
  38. vector<T> get_polynom() const {
  39. return polynom;
  40. }
  41.  
  42. size_t get_size() const {
  43. return polynom.size();
  44. }
  45.  
  46. template <class A, class B>
  47. friend Polynomial<T> operator - (const A& a, const B& b) {
  48. vector<T> preres;
  49. auto pol1 = Polynomial<T>(a);
  50. auto pol2 = Polynomial<T>(b);
  51. if (pol1.get_size() >= pol2.get_size()) {
  52. for (size_t i = 0; i < pol2.get_size(); i++) {
  53. preres.push_back(pol1.polynom[i] - pol2.polynom[i]);
  54. }
  55. for (size_t i = pol2.get_size() + 1; i < pol1.get_size(); i++) {
  56. preres.push_back(pol1.polynom[i]);
  57. }
  58. } else {
  59. for (size_t i = 0; i < pol1.get_size(); i++) {
  60. preres.push_back(pol1.polynom[i] - pol2.polynom[i]);
  61. }
  62. for (size_t i = pol1.get_size() + 1; i < pol2.get_size(); i++) {
  63. preres.push_back(T() - pol2.polynom[i]);
  64. }
  65. }
  66.  
  67. return Polynomial<T>(preres);
  68. }
  69.  
  70. template <class A>
  71. Polynomial<T> &operator-=(const A &a) {
  72. auto pol = Polynomial<T>(a);
  73. *this = *this - pol;
  74. return *this;
  75. }
  76.  
  77. template <class A, class B>
  78. friend Polynomial<T> operator + (const A& a, const B& b) {
  79. vector<T> preres;
  80. auto pol1 = Polynomial<T>(a);
  81. auto pol2 = Polynomial<T>(b);
  82. if (pol1.get_size() >= pol2.get_size()) {
  83. for (size_t i = 0; i < pol2.get_size(); i++) {
  84. preres.push_back(pol1.polynom[i] + pol2.polynom[i]);
  85. }
  86. for (size_t i = pol2.get_size() + 1; i < pol1.get_size(); i++) {
  87. preres.push_back(pol1.polynom[i]);
  88. }
  89. } else {
  90. for (size_t i = 0; i < pol1.get_size(); i++) {
  91. preres.push_back(pol1.polynom[i] + pol2.polynom[i]);
  92. }
  93. for (size_t i = pol1.get_size() + 1; i < pol2.get_size(); i++) {
  94. preres.push_back(pol2.polynom[i]);
  95. }
  96. }
  97.  
  98. return Polynomial<T>(preres);
  99. }
  100.  
  101. template <class A>
  102. Polynomial<T> &operator+=(const A& a) {
  103. auto pol = Polynomial<T>(a);
  104. *this = *this + pol;
  105. return *this;
  106. }
  107.  
  108. /* vector<T> multiply(vector<T> A, vector<T> B) {
  109. size_t m = A.size();
  110. size_t n = B.size();
  111. vector<T> prod;
  112. for (size_t i = 0; i < m + n - 1; i++) {
  113. prod.push_back(T());
  114. }
  115. for (size_t i = 0; i< m; i++) {
  116. for (size_t j = 0; j < n; j++) {
  117. prod[i + j] += A[i] * B[j];
  118. }
  119. }
  120. return prod;
  121. }*/
  122.  
  123. template<typename A>
  124. bool operator == (const A& a) const {
  125. auto pol = Polynomial<T>(a);
  126. return equal((*this).polynom.begin(), (*this).polynom.end(),
  127. pol.polynom.begin(), pol.polynom.end());
  128. }
  129.  
  130. /* template<typename S>
  131. bool operator==(const S &other1) const {
  132. Polynomial other(other1);
  133. return equal((*this).coeff.begin(), (*this).coeff.end(),
  134. other.coeff.begin(), other.coeff.end());
  135. }*/
  136.  
  137. template<typename A>
  138. bool operator!=(const A& a) const {
  139. Polynomial<T> pol(a);
  140. return !(pol == *this);
  141. }
  142.  
  143. /* void operator *= (Polynomial<T> pol) {
  144. vector<T> result_coeff = multiply(polynom, pol.polynom);
  145. polynom = result_coeff;
  146. this->delete_zeros();
  147. }
  148.  
  149. void operator *= (T pol) {
  150. for (size_t i = 0; i < polynom.size(); i++) {
  151. polynom[i] *= pol;
  152. }
  153. this->delete_zeros();
  154. }
  155.  
  156.  
  157.  
  158. Polynomial<T> operator * (Polynomial<T> pol) const {
  159. vector<T> preres = this->polynom;
  160. Polynomial<T> result(preres);
  161. result *= pol;
  162. return result;
  163. }
  164.  
  165. Polynomial<T> operator * (T pol) const {
  166. vector<T> preres = this->polynom;
  167. for (size_t i = 0; i < polynom.size(); i++) {
  168. preres[i] *= pol;
  169. }
  170. Polynomial<T> result(preres);
  171. return result;
  172. }
  173. */
  174.  
  175. template<typename A>
  176. T operator[](const A &id) const {
  177. if (static_cast<size_t > (id) >= (*this).polynom.size()) {
  178. return T();
  179. }
  180. return (*this).polynom[static_cast<size_t > (id)];
  181. }
  182.  
  183. /* T operator ()(T id) const {
  184. if (id == T()) {
  185. return polynom[0];
  186. } else {
  187. T x = T(1);
  188. T result = T();
  189. for (size_t i = 0; i < polynom.size(); i++) {
  190. result += x * polynom[i];
  191. x *= id;
  192. }
  193. return result;
  194. }
  195. }*/
  196.  
  197. int Degree() const {
  198. if (polynom.size() == 1 && polynom[0] == T()) {
  199. return -1;
  200. } else {
  201. return static_cast<int>(polynom.size() - 1);
  202. }
  203. }
  204.  
  205.  
  206.  
  207. auto begin() const {
  208. return polynom.begin();
  209. }
  210.  
  211. auto end() const {
  212. return polynom.end();
  213. }
  214.  
  215. };
  216.  
  217. class int2 {
  218. private:
  219. int int1;
  220. public:
  221. int2(int i) {
  222. this->int1 = i;
  223. }
  224.  
  225. int2() {
  226. this->int1 = 0;
  227. }
  228.  
  229. bool operator == (const int2& i) const {
  230. return int1 == i.get();
  231. }
  232.  
  233. bool operator != (const int2& i) const {
  234. return int1 != i.get();
  235. }
  236.  
  237. int get() const {
  238. return this->int1;
  239. }
  240.  
  241. int2 operator + (int2 i1) const {
  242. int res = this->int1 + i1.get();
  243. return int2(res);
  244. }
  245.  
  246. void operator += (int2 i1) {
  247. int1 += i1.get();
  248. }
  249.  
  250. int2 operator - (int2 i1) const {
  251. int res = this->int1 - i1.get();
  252. return int2(res);
  253. }
  254.  
  255. void operator -= (int2 i1) {
  256. int1 -= i1.get();
  257. }
  258.  
  259. int2 operator * (int2 i1) const {
  260. int res = this->int1 * i1.get();
  261. return int2(res);
  262. }
  263.  
  264. void operator *= (int2 i1) {
  265. int1 *= i1.get();
  266. }
  267.  
  268. operator int() {
  269. return this->int1;
  270. }
  271.  
  272.  
  273. };
  274.  
  275. void coutVector(vector<int2> re) {
  276. for (int2 i : re) {
  277. cout << i.get() << " ";
  278. }
  279. cout << endl;
  280. }
  281.  
  282. void coutVector2(vector<int> re) {
  283. for (int i : re) {
  284. cout << i << " ";
  285. }
  286. cout << endl;
  287. }
  288.  
  289. int main() {
  290. vector<int2> res = { int2(1), int2(1), int2(1), int2(1) };
  291. vector<int2> res2 = { int2(2), int2(3), int2(4), int2(5) };
  292. Polynomial<int2> p(res);
  293. coutVector(p.get_polynom());
  294. Polynomial<int2> p1(res2);
  295. coutVector((p -= p1).get_polynom());
  296. cout << p[1] << endl;
  297. coutVector((p + p1).get_polynom());
  298. coutVector((p += p1).get_polynom());
  299. cout << (p == p1);
  300. cout << (p != p1);
  301. /*vector<int2> res = { int2(1), int2(1), int2(1), int2(1) };
  302. vector<int2> res2 = { int2(2), int2(3), int2(4), int2(5) };
  303. vector<int2> res3 = { int2(1), int2(1), int2(1), int2(1) };
  304. Polynomial<int2> p(res);
  305. Polynomial<int2> p1(res2);
  306. Polynomial<int2> p3(res);
  307. coutVector((p - p3).get_polynom());
  308. coutVector((p - p1).get_polynom());
  309. coutVector(p3.get_polynom());*/
  310. /*coutVector((p * p1).get_polynom());
  311. coutVector((p * int2()).get_polynom());
  312. cout << p1(int2(0));*/
  313. /*vector<int> res = { 1, 2, 3, 4 };
  314. Polynomial<int> hh(res);
  315. coutVector2((hh * 3).get_polynom());
  316. vector<int2> result = { int2(1), int2(2), int2(3), int2(4) };
  317. Polynomial<int2> polynom(result);
  318. vector<int2> result2 = { int2(3), int2(4), int2(5), int2(6) };
  319. Polynomial<int2> polynom2(result2);
  320. vector<int2> r = (polynom * polynom2).get_polynom();
  321. coutVector(r);
  322. vector<int2> r1 = (polynom + polynom2).get_polynom();
  323. coutVector(r1);
  324. vector<int2> r2 = (polynom - polynom2).get_polynom();
  325. coutVector(r2);
  326. polynom += polynom2;
  327. coutVector(polynom.get_polynom());
  328. polynom -= polynom2;
  329. coutVector(polynom.get_polynom());
  330. polynom *= polynom2;
  331. coutVector(polynom.get_polynom());
  332. polynom += int2(1);
  333. coutVector(polynom.get_polynom());
  334. polynom -= int2(1);
  335. coutVector(polynom.get_polynom());
  336. polynom *= int2(2);
  337. coutVector(polynom.get_polynom());
  338. coutVector((polynom + int2(2)).get_polynom());
  339. coutVector((polynom - int2(2)).get_polynom());
  340. coutVector((polynom * int2(2)).get_polynom());
  341. coutVector((int2(2) + polynom).get_polynom());
  342. coutVector((int2(2) - polynom).get_polynom());
  343. coutVector((int2(2) * polynom).get_polynom());
  344. cout << (polynom != polynom2);*/
  345. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement