Advertisement
Guest User

Untitled

a guest
Feb 20th, 2020
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.52 KB | None | 0 0
  1. #include <iostream>
  2. #include <sstream>
  3. using namespace std;
  4.  
  5.  
  6.  
  7. int gcf(int a, int b) { //greatest common factor
  8.  
  9. int nod = 1;
  10. for (int i = abs(a); i > 0; i--) {
  11. if (abs(a) % i == 0 && abs(b) % i == 0) {
  12. nod = i;
  13. break;
  14. }
  15. }
  16. return nod;
  17. }
  18.  
  19. int lcm(int n1, int n2) //least common multiple
  20. {
  21. return abs(n1) * abs(n2) / gcf(n1, n2);
  22. }
  23.  
  24. class Rational {
  25. public:
  26. Rational() {
  27. numerator = 0;
  28. denominator = 1;
  29. };
  30. Rational(int new_numerator, int new_denominator) {
  31. // solving probs with sign
  32. if (new_numerator == 0)
  33. {
  34. new_denominator = 1;
  35. }
  36. else if (new_numerator < 0 && new_denominator < 0)
  37. {
  38. new_numerator = new_numerator * (-1);
  39. new_denominator = new_denominator * (-1);
  40. }
  41. else if (new_numerator < 0 && new_denominator > 0)
  42. {
  43. sign = -1;
  44. new_numerator = new_numerator * (-1);
  45. }
  46. else if (new_numerator > 0 && new_denominator < 0)
  47. {
  48. sign = -1;
  49. new_denominator = new_denominator * (-1);
  50. }
  51.  
  52.  
  53.  
  54. int greatest_common_factor = gcf(new_numerator, new_denominator);
  55. numerator = sign * new_numerator / greatest_common_factor;
  56. denominator = new_denominator / greatest_common_factor;
  57.  
  58. };
  59. int Numerator() const {
  60. return numerator;
  61. };
  62. int Denominator() const {
  63. return denominator;
  64. };
  65. private:
  66. int numerator;
  67. int denominator;
  68. int sign = 1;
  69.  
  70. };
  71. Rational operator+(Rational& lhs, Rational& rhs) { // надо чтобы в функцую lcm подавались только значения > 0;
  72. if (lhs.Denominator() == rhs.Denominator())
  73. {
  74. return { lhs.Numerator() + rhs.Numerator(), lhs.Denominator()};
  75. }
  76. else {
  77.  
  78. int least_common_multiple = lcm(lhs.Denominator(), rhs.Denominator());
  79. int k1,k2;
  80. k1 = least_common_multiple / lhs.Denominator();
  81. int new_lhs_numerator = lhs.Numerator() * k1;
  82. k2 = least_common_multiple / rhs.Denominator();
  83. int new_rhs_numerator = rhs.Numerator() * k2;
  84. return { new_lhs_numerator + new_rhs_numerator, lhs.Denominator()*k1};
  85. }
  86. }
  87. Rational operator-(Rational& lhs, Rational& rhs) {
  88. if (lhs.Denominator() == rhs.Denominator())
  89. {
  90. return { lhs.Numerator() - rhs.Numerator(), lhs.Denominator()};
  91. }
  92. else {
  93. int least_common_multiple = lcm(lhs.Denominator(), rhs.Denominator());
  94. int k1, k2;
  95. k1 = least_common_multiple / lhs.Denominator();
  96. int new_lhs_numerator = lhs.Numerator() * k1;
  97. k2 = least_common_multiple / rhs.Denominator();
  98. int new_rhs_numerator = rhs.Numerator() * k2;
  99. return { new_lhs_numerator - new_rhs_numerator, lhs.Denominator()*k1};
  100. }
  101. }
  102. bool operator==(const Rational& lhs, const Rational& rhs) {
  103. if ((lhs.Numerator() == rhs.Numerator()) && (lhs.Denominator() == rhs.Denominator()))
  104. return 1;
  105. else return 0;
  106. }
  107.  
  108. Rational operator*(const Rational& lhs, const Rational& rhs) {
  109. int new_nominator = lhs.Numerator() * rhs.Numerator();
  110. int new_denominator = lhs.Denominator()*rhs.Denominator();
  111. return { new_nominator , new_denominator };
  112. }
  113.  
  114. Rational operator/(const Rational& lhs, const Rational& rhs) { // (a/b) / (c/d) = (a * d) / (b * c)
  115. int new_nominator = lhs.Numerator() * rhs.Denominator();
  116. int new_denominator = lhs.Denominator() * rhs.Numerator();
  117. return { new_nominator , new_denominator };
  118. }
  119.  
  120. ostream& operator<<(ostream& stream,const Rational& rational) {
  121. stream << rational.Numerator() << "/" << rational.Denominator();
  122. return stream;
  123. }
  124. istream& operator>>(istream& stream, Rational& rational) {
  125. int new_numerator, new_denominator;
  126.  
  127. stream >> new_numerator;
  128. stream.ignore(1);
  129. stream >> new_denominator;
  130. rational = Rational(new_numerator, new_denominator);
  131. return stream;
  132. }
  133. int main() {
  134. {
  135. ostringstream output;
  136. output << Rational(-6, 8);
  137. if (output.str() != "-3/4") {
  138. cout << "Rational(-6, 8) should be written as \"-3/4\"" << endl;
  139. return 1;
  140. }
  141. }
  142.  
  143. {
  144. istringstream input("5/7");
  145. Rational r;
  146. input >> r;
  147. bool equal = r == Rational(5, 7);
  148. if (!equal) {
  149. cout << "5/7 is incorrectly read as " << r << endl;
  150. return 2;
  151. }
  152. }
  153.  
  154. {
  155. istringstream input("5/7 10/8");
  156. Rational r1, r2;
  157. input >> r1 >> r2;
  158. bool correct = r1 == Rational(5, 7) && r2 == Rational(5, 4);
  159. if (!correct) {
  160. cout << "Multiple values are read incorrectly: " << r1 << " " << r2 << endl;
  161. return 3;
  162. }
  163.  
  164. input >> r1;
  165. input >> r2;
  166. correct = r1 == Rational(5, 7) && r2 == Rational(5, 4);
  167. if (!correct) {
  168. cout << "Read from empty stream shouldn't change arguments: " << r1 << " " << r2 << endl;
  169. return 4;
  170. }
  171. }
  172.  
  173. cout << "OK" << endl;
  174. return 0;
  175. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement