Advertisement
Guest User

Untitled

a guest
Dec 15th, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.76 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4.  
  5. template <typename T>
  6. class Polynomial {
  7. private:
  8. std::vector<T> data;
  9. size_t size;
  10.  
  11. void normalize() {
  12. if (data.empty()) {
  13. size = 0;
  14. } else {
  15. size_t pos = data.size() - 1;
  16. while (data[pos] == static_cast<T>(0) && pos != 0) {
  17. data.pop_back();
  18. --pos;
  19. }
  20. if (data.size() == 1 && data[0] == static_cast<T>(0)) {
  21. data.pop_back();
  22. }
  23. size = data.size();
  24. }
  25. }
  26.  
  27. public:
  28. Polynomial<T>(const std::vector<T> &a):data(a) {
  29. this->normalize();
  30. }
  31.  
  32. template <typename Iter>
  33. Polynomial<T>(Iter first, Iter last) {
  34. while (first != last) {
  35. data.push_back(*first++);
  36. }
  37. this->normalize();
  38. }
  39.  
  40. Polynomial<T>(const T &num = T()) {
  41. data.push_back(num);
  42. this->normalize();
  43. }
  44.  
  45. T operator [] (size_t i) const {
  46. if (i >= data.size()) {
  47. return static_cast<T>(0);
  48. }
  49. return data[i];
  50. }
  51.  
  52. int Degree() const {
  53. return data.size() - 1;
  54. }
  55.  
  56. size_t Range() const {
  57. return data.size();
  58. }
  59.  
  60. bool operator == (const Polynomial<T> &other) const {
  61. if (this->Degree() != other.Degree()) {
  62. return false;
  63. }
  64. for (size_t i = 0; i != this->Range(); ++i) {
  65. if (data[i] != other[i]) {}
  66. return false;
  67. }
  68. return true;
  69. }
  70.  
  71. bool operator != (const Polynomial<T> &other) const {
  72. return !(*this == other);
  73. }
  74.  
  75. Polynomial<T>& operator += (const Polynomial<T> &other) {
  76. std::vector<T> ans = {};
  77. ans.resize(std::max(this->Range(), other.Range()));
  78. for (size_t i = 0; i != this->Range(); ++i) {
  79. ans[i] = data[i];
  80. }
  81. for (size_t i = 0; i != other.Range(); ++i) {
  82. ans[i] += other[i];
  83. }
  84. data = ans;
  85. normalize();
  86. return *this;
  87. }
  88.  
  89. Polynomial<T>& operator -= (const Polynomial<T> &other) {
  90. std::vector<T> ans = {};
  91. ans.resize(std::max(this->Range(), other.Range()));
  92. for (size_t i = 0; i != this->Range(); ++i) {
  93. ans[i] = data[i];
  94. }
  95. for (size_t i = 0; i != other.Range(); ++i) {
  96. ans[i] -= other[i];
  97. }
  98. data = ans;
  99. normalize();
  100. return *this;
  101. }
  102.  
  103. auto begin() const {
  104. return data.begin();
  105. }
  106.  
  107. auto end() const {
  108. return data.end();
  109. }
  110. };
  111.  
  112. template <typename T>
  113. Polynomial<T> operator +(const Polynomial<T> &first, const Polynomial<T> &second) {
  114. auto copy(first);
  115. return copy += second;
  116. }
  117.  
  118. template <typename T>
  119. Polynomial<T> operator +(const Polynomial<T> &poly, const T &num) {
  120. auto copy(poly);
  121. return copy += Polynomial<T>(num);
  122. }
  123.  
  124. template <typename T>
  125. Polynomial<T> operator +(const T &num, const Polynomial<T> &poly) {
  126. auto copy(poly);
  127. return copy += Polynomial<T>(num);
  128. }
  129.  
  130. template <typename T>
  131. Polynomial<T> operator -(const Polynomial<T> &first, const Polynomial<T> &second) {
  132. auto copy(first);
  133. return copy -= second;
  134. }
  135.  
  136. template <typename T>
  137. Polynomial<T> operator -(const Polynomial<T> &poly, const T &num) {
  138. auto copy(poly);
  139. return copy -= Polynomial<T>(num);
  140. }
  141.  
  142. template <typename T>
  143. Polynomial<T> operator -(const T &num, const Polynomial<T> &poly) {
  144. auto copy(poly);
  145. return copy -= Polynomial<T>(num);
  146. }
  147.  
  148. int main() {
  149. Polynomial<int> a({1, 2, 3}), b({4, 5, 6});
  150. std::cout << a.Degree() << ' ' << b.Degree() << a[2] << ' ' << b[2] << (a + b)[2];
  151. Polynomial<int> c(a.begin(), a.end());
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement