Rational.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #include "Rational.h"
  2. #include <iostream>
  3. using namespace std;
  4. Rational::Rational(){
  5. num = 0;
  6. denum = 1;
  7. }
  8. Rational::Rational(int num1, int num2)
  9. {
  10. num = num1;
  11. denum = num2;
  12. simple();
  13. }
  14. Rational& Rational::operator += (const Rational& r)
  15. {
  16. int scm = lcm(denum, r.denum);
  17. num = (num * (scm/denum) + r.num * (scm/r.denum));
  18. denum = scm;
  19. return *this;
  20. }
  21. Rational Rational :: operator + (const Rational& r) const
  22. {
  23. Rational res(*this);
  24. return res += r;
  25. }
  26. Rational& Rational::operator -= (const Rational& r)
  27. {
  28. int scm = lcm(denum, r.denum);
  29. num = (num * (scm/denum) - r.num * (scm/r.denum));
  30. denum = scm;
  31. return *this;
  32. }
  33. Rational Rational :: operator - (const Rational& r) const
  34. {
  35. Rational res(*this);
  36. return res -= r;
  37. }
  38. Rational& Rational::operator *= (const Rational& r)
  39. {
  40. num *= r.num;
  41. denum *= r.denum;
  42. simple();
  43. return *this;
  44. }
  45. Rational Rational :: operator * (const Rational& r) const
  46. {
  47. Rational res(*this);
  48. return res *= r;
  49. }
  50. Rational& Rational::operator /= (const Rational& r)
  51. {
  52. num *= r.denum;
  53. denum *= r.num;
  54. simple();
  55. return *this;
  56. }
  57. Rational Rational :: operator / (const Rational& r) const
  58. {
  59. Rational res(*this);
  60. return res /= r;
  61. }
  62. ostream& operator <<(ostream& out, const Rational& r)
  63. {
  64. return out << '(' << r.num << ")/(" << r.denum << ')';
  65. }
  66. Rational::operator double() const
  67. {
  68. return ((double)num/(double)denum);
  69. }
  70. Rational::operator int() const
  71. {
  72. return int(double(*this));
  73. }
  74. int Rational::lcm(int num1, int num2)
  75. {
  76. int result = 1;
  77. for(int dnum = 2; num1 > 1 or num2 > 1; dnum++)
  78. {
  79. if(num1%dnum==0 or num2%dnum==0)
  80. {
  81. num1%dnum==0 ? num1/=dnum : num1*1;
  82. num2%dnum==0 ? num2/=dnum : num1*1;
  83. result *= dnum;
  84. dnum--;
  85. }
  86. }
  87. return result;
  88. }
  89. int Rational::gcd(int num1, int num2)
  90. {
  91. while (num1 && num2)
  92. if (num1 >= num2)
  93. num1 %= num2;
  94. else
  95. num2 %= num1;
  96. return num1 | num2;
  97. }
  98. void Rational::simple()
  99. {
  100. int gct = gcd(num, denum);
  101. num /= gct;
  102. denum /= gct;
  103. }