123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373 |
- #include "Rational.h"
- #include <iostream>
- #include <cmath>
- using namespace std;
- int max(int a, int b) {
- if (a >= b)
- return a;
- return b;
- }
- int min(int a, int b) {
- if (a <= b)
- return a;
- return b;
- }
- Rational::Rational() {
- Chisl = 0;
- Znam = 1;
- sign = 0;
- }
- Rational::Rational(int _x) {
- Chisl = _x;
- Znam = 1;
- sign = _x < 0;
- }
- Rational::Rational(int _x, int _y) {
- sign = !((_x >=0 && _y >= 0) || (_x<0 && _y<0));
- Chisl = _x>=0 ? _x:-_x;
- Znam = _y>=0 ?_y:-_y;
- ;
- socr();
- }
- Rational::Rational(double _x) {
- //0x10000000000000
- unsigned long long int bits = *(unsigned long long int*)(&_x);
- sign = bits >> 63;
- long long int mant = (bits & 0xFFFFFFFFFFFFF) | 0x10000000000000;
- long long exp = (bits >> 52) & 0x7ff;
- exp -= 1075;
- //cout << hex << sign << '\t' << hex << mant << '\t' << hex << exp << '\t' << dec << bits << '\t' << hex << bits << '\n';
- long long t = ((long long int)1 << 52);
- //cout <<hex << t;
- long long num, denum;
- Chisl = mant;
- Znam = (pow(2,-exp));
- socr();
- }
- //ñîêðàùåíèå
- void
- Rational::socr() {
- sign = (!((Chisl >= 0 && Znam >= 0) || (Chisl < 0 && Znam < 0)))||sign;
- Chisl = Chisl >= 0 ? Chisl : -Chisl;
- Znam = Znam >= 0 ? Znam : -Znam;
- long long a, b,zero=0;
- a = Chisl;
- b = Znam;
-
- int end = 0;
- while (a != zero && b != zero && end!= INT_MAX) {
- //end++;
- if (a > b) {
- a %= b;
- }
- else
- b %= a;
- }
- if (end != INT_MAX) {
- Chisl /= (a + b);
- Znam /= (a + b);
- }
- }
- //êîðåíü
- const double
- Rational::root() {
- return sqrt(Chisl) / sqrt(Znam);
- }
- //îïåðàòîðû ôîðìàòà *=
- const Rational&
- Rational::operator += (const Rational& r) {
- long long obsh_znam = Znam * r.Znam;
- long long mod1, mod2;
- mod1 = sign ? -1 : 1;
- mod2 = r.sign ? -1 : 1;
- Chisl = Chisl * r.Znam * mod1 + r.Chisl * Znam * mod2;
- Znam = obsh_znam;
- sign = Chisl < 0;
- socr();
- return *this;
- }
- const Rational&
- Rational::operator -= (const Rational& r) {
- long long obsh_znam = Znam * r.Znam;
- long long mod1, mod2;
- mod1 = sign ? -1 : 1;
- mod2 = r.sign ? -1 : 1;
- Chisl = Chisl * r.Znam * mod1 - r.Chisl * Znam * mod2;
- Znam = obsh_znam;
- sign = (Chisl < 0);
- Chisl = Chisl >= 0 ? Chisl : -Chisl;
- socr();
- return *this;
- }
- const Rational&
- Rational::operator*=(const Rational& r) {
- Chisl = Chisl * r.Chisl;
- Znam = Znam * r.Znam;
- sign = !(sign == r.sign);
- socr();
- return *this;
- }
- const Rational&
- Rational::operator/=(const Rational& r) {
- Chisl = Chisl * r.Znam;
- Znam = Znam * r.Chisl;
- sign = !(sign == r.sign);
- socr();
- return *this;
- }
- //ñðàâíåíèå
- const bool&
- Rational::operator < (const Rational& r) {
- Rational r1 = *this;
- Rational r2 = r;
- r1.Chisl *= r2.Znam;
- r2.Chisl *= r1.Znam;
- return r1.Chisl < r2.Chisl;
- }
- const bool&
- Rational::operator > (const Rational& r) {
- Rational r1 = *this;
- Rational r2 = r;
- r1.Chisl *= r2.Znam;
- r2.Chisl *= r1.Znam;
- return r1.Chisl > r2.Chisl;
- }
- const bool&
- Rational::operator >= (const Rational& r) {
- Rational r1 = *this;
- Rational r2 = r;
- return !(r1 < r2);
- }
- const bool&
- Rational::operator<=(const Rational& r) {
- Rational r1 = *this;
- Rational r2 = r;
- return !(r1 > r2);
- }
- const bool&
- Rational::operator==(const Rational& r) {
- Rational r1 = *this;
- Rational r2 = r;
- r1.Chisl *= r2.Znam;
- r2.Chisl *= r1.Znam;
- return r1.Chisl == r2.Chisl;
- }
- const bool&
- Rational::operator!=(const Rational& r) {
- Rational r1 = *this;
- Rational r2 = r;
- return !(r1 == r2);
- }
- //ñëîæåíèå óìíîæåíèå
- const Rational&
- Rational::operator + (const Rational& r1) {
- Rational res = *this;
- res += r1;
- return res;
- }
- const Rational&
- Rational::operator - (const Rational& r1) {
- Rational res = *this;
- res -= r1;
- return res;
- }
- const Rational&
- Rational::operator * (const Rational& r1) {
- Rational res = *this;
- res *= r1;
- return res;
- }
- const Rational&
- Rational::operator / (const Rational& r1) {
- Rational res = *this;
- res /= r1;
- return res;
- }
- //ñ äðóãèì òèïîì ïåðåìåííûõ
- const Rational&
- Rational::operator *= (const int& r) {
- Chisl *= r;
- socr();
- return *this;
- }
- const Rational&
- Rational::operator/=(const int& r) {
- Znam *= r;
- socr();
- return *this;
- }
- const Rational&
- Rational::operator+=(const int& r) {
- Rational r_t = Rational(r);
- *this += r_t;
- return *this;
- }
- const Rational&
- Rational::operator-=(const int& r) {
- Rational r_t = Rational(r);
- *this -= r_t;
- return *this;
- }
- const Rational&
- Rational::operator * ( const int& i) {
- Rational res = *this;
- res *= i;
- return res;
- }
- const Rational&
- Rational::operator + (const int& i) {
- Rational res = *this;
- res += i;
- return res;
- }
- const Rational&
- Rational::operator - (const int& i) {
- Rational res = *this;
- res -= i;
- return res;
- }
- const Rational&
- Rational::operator / (const int& i) {
- Rational res = *this;
- res /= i;
- return res;
- }
- istream&
- operator >>(istream& is, Rational& r) {
- char input[10000];
- r.Chisl = 0;
- r.Znam = 1;
- r.sign = false;
- is >> input;
- int splitter = 0;
- bool checker;
- while (input[splitter] != '/' && input[splitter]) {
- splitter++;
- }
- checker = input[splitter] != '/';
- int dec = 1;
- for (int i = splitter - 1; i >= 0; i--) {
- if (input[i] != '-')
- r.Chisl += (input[i] - 48) * dec;
- else {
- r.sign = !r.sign;
- }
- dec *= 10;
- }
- if (!checker) {
- while (input[splitter])
- splitter++;
- dec = 1;
- r.Znam = 0;
- for (int i = splitter - 1; input[i] != '/'; i--) {
- if (input[i] != 45)
- r.Znam += (input[i] - 48) * dec;
- else{
- r.sign = !r.sign;
- }
- dec *= 10;
- }
- }
- r.socr();
- return is;
- }
- ostream&
- operator <<(ostream& os, Rational& r) {
- if (r.Chisl % r.Znam == 0)
- return os << "\n " << r.Chisl << '/' << r.Znam << "\n";
- double len_max = log10((double)max(r.Chisl, r.Znam));
- for (int i = 0; i < (int)(len_max - log10(r.Chisl)) / 2; i++) {
- os << " ";
- }
- os << " " << r.Chisl << endl;
- if (r.sign)
- os << '-' << ' ';
- else
- os << " ";
- for (int i = 0; i < len_max; i++) {
- os << "=";
- }
- os << endl << " ";
- for (int i = 0; i < (int)(len_max - log10(r.Znam)) / 2; i++) {
- os << " ";
- }
- os << r.Znam;
- return os;
- }
|