@@ -15,14 +15,16 @@ long long lcm(long long a, long long b)
1515 return (a * b) / gcd (a, b);
1616}
1717
18- Rational::Rational (long long numerator, long long denominator) : _numerator(denominator > 0 ? numerator : -numerator),
18+ Rational::Rational (long long numerator, long long denominator) : _integer(0 ),
19+ _numerator(denominator > 0 ? numerator : -numerator),
1920 _denominator(denominator ? (denominator > 0 ? denominator : -denominator) : 1)
2021{
2122 assert (denominator != 0 );
2223 this ->simplify ();
2324}
2425
25- Rational::Rational (const Rational &temp, bool invert) : _numerator(invert ? temp._denominator : temp._numerator),
26+ Rational::Rational (const Rational &temp, bool invert) : _integer(0 ),
27+ _numerator(invert ? temp._denominator : temp._numerator),
2628 _denominator(invert ? temp._numerator : temp._denominator)
2729{
2830 this ->simplify ();
@@ -45,6 +47,11 @@ long long &Rational::denominator()
4547 return _denominator;
4648}
4749
50+ long long &Rational::integer ()
51+ {
52+ return _integer;
53+ }
54+
4855double Rational::get_value ()
4956{
5057 return (double )_numerator / (double )_denominator;
@@ -60,6 +67,24 @@ Rational &Rational::simplify()
6067 _numerator /= factor;
6168 _denominator /= factor;
6269 }
70+ normalize ();
71+ return *this ;
72+ }
73+
74+ Rational &Rational::normalize ()
75+ {
76+ if (!_integer)
77+ _integer = _numerator / _denominator;
78+ _numerator %= _denominator;
79+ // if (_integer && _numerator < 0) _numerator *= -1;
80+ return *this ;
81+ }
82+
83+ Rational &Rational::denormalize ()
84+ {
85+ // if (_integer < 0 && _numerator > 0) _numerator *= -1;
86+ _numerator += _integer * _denominator;
87+ _integer = 0 ;
6388 return *this ;
6489}
6590
@@ -74,7 +99,29 @@ istream &operator>>(istream &in, Rational &temp)
7499
75100ostream &operator <<(ostream &out, const Rational &r)
76101{
77- out << r._numerator << " / " << r._denominator ;
102+ long long num = r._numerator ;
103+ if (r._integer )
104+ {
105+ out << r._integer ;
106+ if (num)
107+ {
108+ if (r._integer > 0 )
109+ out << " +" ;
110+ if (r._integer < 0 )
111+ out << " -" ;
112+ if (num < 0 )
113+ num *= -1 ;
114+ }
115+ }
116+ if (r._numerator )
117+ {
118+ out << " (" << num;
119+ if (r._denominator != 1 )
120+ out << " /" << r._denominator ;
121+ out << " )" ;
122+ }
123+ else
124+ out << 0 ;
78125 return out;
79126}
80127
@@ -96,7 +143,8 @@ Rational &Rational::operator=(const long long &temp)
96143
97144bool operator ==(const Rational &r1, const Rational &r2)
98145{
99- return (r1._numerator == r2._numerator &&
146+ return (r1._integer == r2._integer &&
147+ r1._numerator == r2._numerator &&
100148 r1._denominator == r2._denominator );
101149}
102150
@@ -107,12 +155,12 @@ bool operator!=(const Rational &r1, const Rational &r2)
107155
108156const Rational Rational::operator +()
109157{
110- return Rational (_numerator, _denominator);
158+ return Rational (_numerator + _integer * _denominator , _denominator);
111159}
112160
113161const Rational Rational::operator -()
114162{
115- return Rational (-_numerator, _denominator);
163+ return Rational (-( _numerator + _integer * _denominator) , _denominator);
116164}
117165
118166Rational &Rational::operator ++()
@@ -146,8 +194,8 @@ Rational Rational::operator--(int)
146194Rational operator +(const Rational &r1, const Rational &r2)
147195{
148196 Rational temp (
149- r1._numerator * r2._denominator +
150- r2._numerator * r1._denominator ,
197+ ( r1._numerator + r1. _integer * r1. _denominator ) * r2._denominator +
198+ ( r2._numerator + r2. _integer * r2. _denominator ) * r1._denominator ,
151199 r1._denominator * r2._denominator );
152200 return temp.simplify ();
153201};
@@ -184,7 +232,7 @@ Rational operator-(long long value, const Rational &r)
184232Rational operator *(const Rational &r1, const Rational &r2)
185233{
186234 Rational temp (
187- r1._numerator * r2._numerator ,
235+ ( r1._numerator + r1. _integer * r2._denominator ) * (r2. _numerator + r2. _integer + r2. _denominator ) ,
188236 r1._denominator * r2._denominator );
189237 return temp.simplify ();
190238};
@@ -274,8 +322,8 @@ bool operator>(const Rational &r1, const Rational &r2)
274322{
275323 long long L = lcm (r1._denominator , r2._denominator );
276324 return (
277- r1._numerator * L / r1._denominator >
278- r2._numerator * L / r2._denominator );
325+ ( r1._numerator + r1. _integer * r1. _denominator ) * L / r1._denominator >
326+ ( r2._numerator + r1. _integer * r1. _denominator ) * L / r2._denominator );
279327};
280328
281329bool operator <=(const Rational &r1, const Rational &r2)
@@ -291,4 +339,25 @@ bool operator<(const Rational &r1, const Rational &r2)
291339bool operator >=(const Rational &r1, const Rational &r2)
292340{
293341 return (r1 == r2 || r1 > r2);
294- };
342+ };
343+
344+ // сортировка Шелла
345+
346+ void ShellSort (int n, Rational *mass[])
347+ {
348+ int i, j, step;
349+ Rational *tmp;
350+ for (step = n / 2 ; step > 0 ; step /= 2 )
351+ for (i = step; i < n; i++)
352+ {
353+ tmp = mass[i];
354+ for (j = i; j >= step; j -= step)
355+ {
356+ if (*tmp < *mass[j - step])
357+ mass[j] = mass[j - step];
358+ else
359+ break ;
360+ }
361+ mass[j] = tmp;
362+ }
363+ }
0 commit comments