|
@@ -1,4 +1,5 @@
|
|
|
#include "Rational.h"
|
|
|
+#include "Fraction/Fraction.h"
|
|
|
#include <iostream>
|
|
|
#include <iomanip>
|
|
|
#include <bitset>
|
|
@@ -12,6 +13,11 @@ Rational::Rational(){
|
|
|
|
|
|
}
|
|
|
|
|
|
+Rational::Rational(int num1){
|
|
|
+ num = num1;
|
|
|
+ denum = 1;
|
|
|
+}
|
|
|
+
|
|
|
Rational::Rational(int num1, int num2)
|
|
|
{
|
|
|
num = num1;
|
|
@@ -65,8 +71,23 @@ Rational::Rational(double x)
|
|
|
|
|
|
Rational& Rational::operator += (const Rational& r)
|
|
|
{
|
|
|
- int scm = lcm(denum, r.denum);
|
|
|
- num = (num * (scm/denum) + r.num * (scm/r.denum));
|
|
|
+ Rational newrr = r;
|
|
|
+ while (INT64_MAX - num < r.num or INT64_MAX - denum < r.denum) {
|
|
|
+ if(num > 10000 or denum > 10000) {
|
|
|
+ Fraction f(*this);
|
|
|
+ f.layers.pop();
|
|
|
+ Rational newr(f);
|
|
|
+ num = newr.num;
|
|
|
+ denum = newr.denum;
|
|
|
+ }
|
|
|
+ if(r.num > 10000 or r.denum > 10000) {
|
|
|
+ Fraction f(r);
|
|
|
+ f.layers.pop();
|
|
|
+ newrr = Rational(f);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ int scm = lcm(denum, newrr.denum);
|
|
|
+ num = (num * (scm/denum) + newrr.num * (scm/newrr.denum));
|
|
|
denum = scm;
|
|
|
return *this;
|
|
|
}
|
|
@@ -93,8 +114,23 @@ Rational Rational :: operator - (const Rational& r) const
|
|
|
|
|
|
Rational& Rational::operator *= (const Rational& r)
|
|
|
{
|
|
|
- num *= r.num;
|
|
|
- denum *= r.denum;
|
|
|
+ Rational newrr = r;
|
|
|
+ while (INT64_MAX / num < r.num or INT64_MAX / denum < r.denum) {
|
|
|
+ if(num > 10000 or denum > 10000) {
|
|
|
+ Fraction f(*this);
|
|
|
+ f.layers.pop();
|
|
|
+ Rational newr(f);
|
|
|
+ num = newr.num;
|
|
|
+ denum = newr.denum;
|
|
|
+ }
|
|
|
+ if(r.num > 10000 or r.denum > 10000) {
|
|
|
+ Fraction f(r);
|
|
|
+ f.layers.pop();
|
|
|
+ newrr = Rational(f);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ num *= newrr.num;
|
|
|
+ denum *= newrr.denum;
|
|
|
simple();
|
|
|
return *this;
|
|
|
}
|
|
@@ -119,6 +155,11 @@ Rational Rational :: operator / (const Rational& r) const
|
|
|
return res /= r;
|
|
|
}
|
|
|
|
|
|
+Rational Rational :: operator -() const
|
|
|
+{
|
|
|
+ return Rational(-num, denum);
|
|
|
+}
|
|
|
+
|
|
|
ostream& operator <<(ostream& out, const Rational& r)
|
|
|
{
|
|
|
return out << '(' << r.num << ")/(" << r.denum << ')';
|
|
@@ -165,4 +206,15 @@ void Rational::simple()
|
|
|
long long int gct = gcd(num, denum);
|
|
|
num /= gct;
|
|
|
denum /= gct;
|
|
|
+}
|
|
|
+
|
|
|
+Rational Rational::sqrt()
|
|
|
+{
|
|
|
+ cout << "Real sqrt" << endl;
|
|
|
+ Rational a = *this;
|
|
|
+ Rational x = *this;
|
|
|
+ for (long long int i = 0; i < 10000; i++) {
|
|
|
+ x = (x + (a / x)) / (Rational)2;
|
|
|
+ }
|
|
|
+ return x;
|
|
|
}
|