Advertisement
Dzham

Untitled

Apr 26th, 2019
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.90 KB | None | 0 0
  1. #include <cmath>
  2. #include <utility>
  3. using namespace std;
  4.  
  5. int NOD(int a, int b) {
  6. a = abs(a);
  7. b = abs(b);
  8. while (a && b) {
  9. if (a > b) {
  10. a %= b;
  11. } else {
  12. b %= a;
  13. }
  14. }
  15. return a + b;
  16. }
  17.  
  18. class Rational {
  19. private:
  20. int num = 0;
  21. int den = 1;
  22.  
  23. public:
  24. Rational() {}
  25.  
  26. Rational(int num, int den) {
  27. if (den < 0) {
  28. num *= -1;
  29. den *= -1;
  30. }
  31. int nod = NOD(num, den);
  32. num /= nod;
  33. den /= nod;
  34. this->num = num;
  35. this->den = den;
  36. }
  37.  
  38. Rational(int num) {
  39. this->num = num;
  40. this->den = 1;
  41. }
  42.  
  43. int numerator() const {
  44. return num;
  45. }
  46.  
  47. int denominator() const {
  48. return den;
  49. }
  50.  
  51. Rational& reduce() {
  52. if (den < 0) {
  53. num *= -1;
  54. den *= -1;
  55. }
  56. int nod = NOD(num, den);
  57. num /= nod;
  58. den /= nod;
  59. return *this;
  60. }
  61.  
  62. Rational& operator += (const Rational& rat) {
  63. Rational r;
  64. r.num = num * rat.denominator() + den * rat.numerator();
  65. r.den = den * rat.denominator();
  66. *this = move(r);
  67. this->reduce();
  68. return *this;
  69. }
  70.  
  71. Rational& operator -= (const Rational& rat) {
  72. Rational r;
  73. r.num = num * rat.denominator() - den * rat.numerator();
  74. r.den = den * rat.denominator();
  75. *this = move(r);
  76. this->reduce();
  77. return *this;
  78. }
  79.  
  80. Rational& operator *= (const Rational& rat) {
  81. num *= rat.numerator();
  82. den *= rat.denominator();
  83. this->reduce();
  84. return *this;
  85. }
  86.  
  87. Rational& operator /= (const Rational& rat) {
  88. int old_num = rat.numerator();
  89. int old_den = rat.denominator();
  90. num *= old_den;
  91. den *= old_num;
  92. this->reduce();
  93. return *this;
  94. }
  95.  
  96. Rational& operator ++() {
  97. num += den;
  98. this->reduce();
  99. return *this;
  100. }
  101.  
  102. Rational operator ++(int) {
  103. Rational r = *this;
  104. ++(*this);
  105. return r;
  106. }
  107.  
  108. Rational& operator --() {
  109. num -= den;
  110. this->reduce();
  111. return *this;
  112. }
  113.  
  114. Rational operator --(int) {
  115. Rational r = *this;
  116. --(*this);
  117. return r;
  118. }
  119.  
  120. Rational operator + () const {
  121. return *this;
  122. }
  123.  
  124. Rational operator - () const {
  125. Rational result(-num, den);
  126. return result;
  127. }
  128. };
  129.  
  130. bool operator == (const Rational& rat1, const Rational& rat2) {
  131. return ((rat1.numerator() == rat2.numerator()) && (rat1.denominator() == rat2.denominator()));
  132. }
  133.  
  134. bool operator != (const Rational& rat1, const Rational& rat2) {
  135. return ((rat1.numerator() != rat2.numerator()) || (rat1.denominator() != rat2.denominator()));
  136. }
  137.  
  138. Rational operator + (const Rational& rat1, const Rational& rat2) {
  139. Rational result = rat1;
  140. return result += rat2;
  141. }
  142.  
  143. Rational operator - (const Rational& rat1, const Rational& rat2) {
  144. Rational result = rat1;
  145. return result -= rat2;
  146. }
  147.  
  148. Rational operator * (const Rational& rat1, const Rational& rat2) {
  149. Rational result = rat1;
  150. return result *= rat2;
  151. }
  152.  
  153. Rational operator / (const Rational& rat1, const Rational& rat2) {
  154. Rational result = rat1;
  155. return result /= rat2;
  156. }
  157.  
  158. #include <vector>
  159. #include <iostream>
  160.  
  161. void printv(std::vector<Rational> v) {
  162. for (auto& i : v) {
  163. std::cout << i.numerator() << "/" << i.denominator() << " ";
  164. }
  165. std::cout << '\n';
  166. }
  167.  
  168. Rational pr(std::vector<Rational> v1, std::vector<Rational> v2) {
  169. Rational ans = 0;
  170. for (int i = 0; i < v1.size(); ++i) {
  171. ans += v1[i] * v2[i];
  172. }
  173. return ans;
  174. }
  175.  
  176. std::vector<Rational> sc(Rational r, std::vector<Rational> v) {
  177. for (auto& i : v) {
  178. i *= r;
  179. }
  180. return v;
  181. }
  182.  
  183. std::vector<Rational> minu(std::vector<Rational> v1, std::vector<Rational> v2) {
  184. for (int i = 0; i < v1.size(); ++i) {
  185. v1[i] -= v2[i];
  186. }
  187. return v1;
  188. }
  189.  
  190. std::vector<Rational> g_smitd(std::vector<Rational> v1, std::vector<Rational> v2) {
  191. return sc((pr(v1, v2) / pr(v1, v1)), v1);
  192. }
  193.  
  194. void prn(Rational r) {
  195. std::cout << r.numerator() << "/" << r.denominator() << ' ';
  196. }
  197.  
  198. int main() {
  199. std::vector<Rational> v1 = { 4, -1, -2, -2 };
  200. std::vector<Rational> v2 = { 0, 1, 0, 0 };
  201. std::vector<Rational> v3 = { 0, 0, 1, 0 };
  202. std::vector<Rational> v4 = { 0, 0, 0, 1 };
  203. v2 = minu(v2, g_smitd(v1, v2));
  204. auto v5 = minu(minu(v3, g_smitd(v1, v3)), g_smitd(v2, v3));
  205. v3 = v5;
  206. auto v6 = minu(minu(minu(v4, g_smitd(v1, v4)), g_smitd(v2, v4)), g_smitd(v3, v4));
  207. v4 = v6;
  208. prn(pr(v1, v1));
  209. std::cout << '\n';
  210. prn(pr(v2, v2));
  211. std::cout << '\n';
  212. prn(pr(v3, v3));
  213. std::cout << '\n';
  214. prn(pr(v4, v4));
  215. std::cout << '\n';
  216. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement