fork download
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <stdlib.h>
  4. #include <sstream>
  5. #include <string>
  6. using namespace std;
  7.  
  8. long long gsd(long long a, long long b){
  9. while (a > 0 && b > 0) {
  10. if (a > b) {
  11. a %= b;
  12. } else {
  13. b %= a;
  14. }
  15.  
  16. }
  17. return (a+b);
  18. }
  19.  
  20. class Rational {
  21. public:
  22. Rational() {
  23. numerator=0;
  24. denominator=1;
  25. }
  26.  
  27. Rational(int n, int d) {
  28. if (d==0)
  29. throw invalid_argument("invalid_argument");
  30. if (n==0){
  31. numerator=0;
  32. denominator=1;
  33. }
  34. else{
  35. int p=gsd(abs(n), abs(d));
  36. if (n*d<0){
  37. numerator=-1*abs(n)/p;
  38. denominator=abs(d)/p;
  39. }
  40. else{
  41. numerator=abs(n)/p;
  42. denominator=abs(d)/p;
  43. }
  44. }
  45.  
  46. }
  47.  
  48. long long Numerator() const {
  49. return numerator; // Реализуйте этот метод
  50. }
  51.  
  52. long long Denominator() const {
  53. return denominator; // Реализуйте этот метод
  54. }
  55.  
  56. private:
  57. int numerator;
  58. int denominator; // Добавьте поля
  59. };
  60. Rational DoRation(int h, int m){
  61. return Rational(h,m);
  62. }
  63. Rational operator+(const Rational& lhs, const Rational& rhs ){
  64. return Rational(lhs.Numerator()*rhs.Denominator()+rhs.Numerator()*lhs.Denominator(), lhs.Denominator()*rhs.Denominator());
  65. }
  66. Rational operator-(const Rational& lhs, const Rational& rhs ){
  67. return Rational(lhs.Numerator()*rhs.Denominator()-rhs.Numerator()*lhs.Denominator(), lhs.Denominator()*rhs.Denominator());
  68. }
  69. bool operator==(const Rational& lhs, const Rational& rhs ){
  70. return (lhs.Numerator()==rhs.Numerator()&& lhs.Denominator()==rhs.Denominator());
  71. }
  72. Rational operator/(const Rational& lhs, const Rational& rhs ){
  73. if (rhs.Numerator()==0) throw domain_error("domain_error");
  74. Rational ac (lhs.Numerator(), rhs.Numerator()); //a/c
  75. Rational db (rhs.Denominator(), lhs.Denominator()); //d/b //a*d/b*c
  76. return Rational(ac.Numerator()*db.Numerator(), ac.Denominator()*db.Denominator());
  77. }
  78. Rational operator*(const Rational& lhs, const Rational& rhs ){
  79. Rational ad (lhs.Numerator(), rhs.Denominator()); //a/d
  80. Rational cb (rhs.Numerator(), lhs.Denominator()); //c/b //a*c/d*b
  81. return Rational(ad.Numerator()*cb.Numerator(), ad.Denominator()*cb.Denominator());
  82. }
  83. bool operator<(const Rational& lhs, const Rational& rhs ){
  84. return (lhs-rhs).Numerator()<0;
  85. }
  86. ostream& operator<<(ostream& stream, const Rational& rational) {
  87. stream << rational.Numerator() << '/'
  88. << rational.Denominator();
  89. return stream;
  90. }
  91. istream& operator>>(istream& stream, Rational& r) {
  92. char s;
  93. int p, q;
  94. if (stream >> p && stream>>s && s=='/' && stream >> q)
  95. r = { p, q };
  96. else throw invalid_argument("invalid_argument");
  97. return stream;
  98. }
  99. int main() {
  100. Rational r1, r2;
  101. char op;
  102. try {
  103. cin>>r1>>op>>r2;
  104.  
  105. if (op=='+') cout<<r1+r2<<endl;
  106. if (op=='-') cout<<r1-r2<<endl;
  107. if (op=='*') cout<<r1*r2<<endl;
  108. if (op=='/'){
  109. try{
  110. cout<<r1/r2;
  111. } catch(domain_error&){
  112. cout<<"Division by zero";
  113. }
  114. }
  115. } catch (invalid_argument&) {
  116. cout<<"Invalid argument";
  117. }
  118.  
  119. return 0;
  120. }
Success #stdin #stdout 0s 4488KB
stdin
1/2 / 0/3
stdout
Division by zero