00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "rational.h"
00013 #include <cstdlib>
00014 #include <cctype>
00015
00016 OPEN_namespace(ADH)
00017 USING_namespace(ADH);
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 bool check_ok( const rational& r ) {
00035 if (&r == 0) {
00036
00037 return false;
00038 }
00039
00040 if ( ! (r.m_den > 0) ) {
00041
00042 return false;
00043 }
00044 if (r.m_num == 0) {
00045 if ( r.m_den == 1 ) {
00046
00047 return true;
00048 }
00049 else {
00050 return false;
00051 }
00052 }
00053 if ( ! ( mcd(r.m_num, r.m_den) == 1 ) ) {
00054
00055 return false;
00056 }
00057 return true;
00058 }
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 bool check_ok_no_Rep( const rational& r ) {
00070 if (&r == 0) {
00071
00072 return false;
00073 }
00074
00075 if ( ! (r.den() > 0) ) {
00076
00077 return false;
00078 }
00079 if (r.num() == 0) {
00080 if ( r.den() == 1 ) {
00081
00082 return true;
00083 }
00084 else {
00085 return false;
00086 }
00087 }
00088 if ( ! ( mcd(r.num(), r.den()) == 1 ) ) {
00089
00090 return false;
00091 }
00092 return true;
00093 }
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112 long mcd(long x, long y) {
00113 long g = (x < 0 ? -x : x);
00114 long r = (y < 0 ? -y : y);
00115 long temp;
00116
00117 do {
00118 temp = r;
00119 r = g % r;
00120 g = temp;
00121 } while (0 != r);
00122
00123 return g;
00124 }
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137 void rational::Simplify() {
00138 if (m_num == 0) {
00139 m_den = 1;
00140 }
00141 long divisor = mcd(m_num, m_den);
00142 if (divisor > 1) {
00143 m_num /= divisor;
00144 m_den /= divisor;
00145 }
00146 if (m_den < 0) {
00147 m_num = -m_num;
00148 m_den = -m_den;
00149 }
00150 }
00151
00152
00153 rational& rational::operator += (const rational& otro) {
00154 m_num = m_num * otro.m_den + m_den * otro.m_num;
00155 m_den *= otro.m_den;
00156 Simplify();
00157
00158 return *this;
00159 }
00160
00161
00162
00163 rational& rational::operator -= (const rational& otro) {
00164 long oldm_den = m_den;
00165 long oldm_num = m_num;
00166 long d = otro.m_den;
00167 long n = otro.m_num;
00168
00169 m_den *= d;
00170 m_num = oldm_num * d - oldm_den * n;
00171 Simplify();
00172
00173 return *this;
00174 }
00175
00176
00177
00178 rational& rational::fromString (const char* nStr) {
00179 char ch;
00180
00181 bool es_positivo = true;
00182
00183
00184 do {
00185 ch = *nStr; nStr++;
00186 if (ch == '-') {
00187 es_positivo = !es_positivo;
00188 }
00189 } while (!isdigit(ch));
00190
00191
00192 long num = 0;
00193 while (isdigit(ch)) {
00194 num = 10 * num + (ch-'0');
00195 ch = *nStr; nStr++;
00196 }
00197
00198
00199 while (isspace(ch)) {
00200 ch = *nStr; nStr++;
00201 }
00202
00203 long den;
00204 if (ch ==']') {
00205 den = 1;
00206 }
00207 else {
00208 do {
00209 ch = *nStr; nStr++;
00210 if (ch == '-') {
00211 es_positivo = !es_positivo;
00212 }
00213 } while (!isdigit(ch));
00214
00215
00216 den = 0;
00217 while (isdigit(ch)) {
00218 den = 10 * den + (ch-'0');
00219 ch = *nStr; nStr++;
00220 }
00221
00222 }
00223
00224
00225
00226 if (! es_positivo) {
00227 num = -num;
00228 }
00229 set( num, den );
00230 return *this;
00231 }
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241 ostream& operator<< (ostream &COUT, const rational& r) {
00242 if ( r.m_den == 1 ) {
00243 return COUT << "[" << r.m_num << "]" ;
00244 } else {
00245 return COUT << "[" << r.m_num << "/" << r.m_den << "]" ;
00246 }
00247 }
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258 istream& operator >> (istream &CIN, rational& r) {
00259 char ch;
00260
00261 bool es_positivo = true;
00262
00263
00264 do {
00265 CIN >> ch;
00266 if (ch == '-') {
00267 es_positivo = !es_positivo;
00268 }
00269 } while (!isdigit(ch));
00270
00271
00272 r.m_num = 0;
00273 while (isdigit(ch)) {
00274 r.m_num = 10 * r.m_num + (ch-'0');
00275 CIN >> ch;
00276 }
00277
00278
00279 while (isspace(ch)) {
00280 CIN >> ch;
00281 }
00282
00283 if (ch ==']') {
00284 r.m_den = 1;
00285 }
00286 else {
00287 do {
00288 CIN >> ch;
00289 if (ch == '-') {
00290 es_positivo = !es_positivo;
00291 }
00292 } while (!isdigit(ch));
00293
00294
00295 r.m_den = 0;
00296 while (isdigit(ch)) {
00297 r.m_den = 10 * r.m_den + (ch-'0');
00298 CIN >> ch;
00299 }
00300
00301
00302
00303
00304 while (ch != ']') {
00305 CIN >> ch;
00306 }
00307 }
00308
00309
00310
00311 if (! es_positivo) {
00312 r.m_num = -r.m_num;
00313 }
00314
00315 r.Simplify();
00316 return CIN;
00317
00318
00319
00320
00321
00322
00323
00324 }
00325
00326
00327
00328 rational operator + (const rational &x, const rational &y) {
00329 long res_num, res_den;
00330 res_den = x.m_den * y.m_den;
00331 res_num = x.m_num * y.m_den + x.m_den * y.m_num;
00332
00333 return rational(res_num, res_den);
00334 }
00335
00336
00337
00338 rational operator - (const rational &x, const rational &y) {
00339 long res_num, res_den;
00340
00341 res_den = x.m_den * y.m_den;
00342 res_num = x.m_num * y.m_den - x.m_den * y.m_num;
00343
00344 return rational(res_num, res_den);
00345 }
00346
00347
00348
00349 rational operator * (const rational &x, const rational &y) {
00350 long res_num, res_den;
00351
00352 res_num = x.m_num * y.m_num;
00353 res_den = x.m_den * y.m_den;
00354
00355 return rational(res_num, res_den);
00356 }
00357
00358
00359
00360
00361 rational operator / (const rational &x, const rational &y) {
00362 long res_num, res_den;
00363 if (0 != y.m_num) {
00364 res_num = x.m_num * y.m_den;
00365 res_den = x.m_den * y.m_num;
00366 }
00367 return rational(res_num, res_den);
00368 }
00369
00370 CLOSE_namespace(ADH)
00371
00372