Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <sstream>
- using namespace std;
- int gcf(int a, int b) { //greatest common factor
- int nod = 1;
- for (int i = abs(a); i > 0; i--) {
- if (abs(a) % i == 0 && abs(b) % i == 0) {
- nod = i;
- break;
- }
- }
- return nod;
- }
- int lcm(int n1, int n2) //least common multiple
- {
- return abs(n1) * abs(n2) / gcf(n1, n2);
- }
- class Rational {
- public:
- Rational() {
- numerator = 0;
- denominator = 1;
- };
- Rational(int new_numerator, int new_denominator) {
- // solving probs with sign
- if (new_numerator == 0)
- {
- new_denominator = 1;
- }
- else if (new_numerator < 0 && new_denominator < 0)
- {
- new_numerator = new_numerator * (-1);
- new_denominator = new_denominator * (-1);
- }
- else if (new_numerator < 0 && new_denominator > 0)
- {
- sign = -1;
- new_numerator = new_numerator * (-1);
- }
- else if (new_numerator > 0 && new_denominator < 0)
- {
- sign = -1;
- new_denominator = new_denominator * (-1);
- }
- int greatest_common_factor = gcf(new_numerator, new_denominator);
- numerator = sign * new_numerator / greatest_common_factor;
- denominator = new_denominator / greatest_common_factor;
- };
- int Numerator() const {
- return numerator;
- };
- int Denominator() const {
- return denominator;
- };
- private:
- int numerator;
- int denominator;
- int sign = 1;
- };
- Rational operator+(Rational& lhs, Rational& rhs) { // надо чтобы в функцую lcm подавались только значения > 0;
- if (lhs.Denominator() == rhs.Denominator())
- {
- return { lhs.Numerator() + rhs.Numerator(), lhs.Denominator()};
- }
- else {
- int least_common_multiple = lcm(lhs.Denominator(), rhs.Denominator());
- int k1,k2;
- k1 = least_common_multiple / lhs.Denominator();
- int new_lhs_numerator = lhs.Numerator() * k1;
- k2 = least_common_multiple / rhs.Denominator();
- int new_rhs_numerator = rhs.Numerator() * k2;
- return { new_lhs_numerator + new_rhs_numerator, lhs.Denominator()*k1};
- }
- }
- Rational operator-(Rational& lhs, Rational& rhs) {
- if (lhs.Denominator() == rhs.Denominator())
- {
- return { lhs.Numerator() - rhs.Numerator(), lhs.Denominator()};
- }
- else {
- int least_common_multiple = lcm(lhs.Denominator(), rhs.Denominator());
- int k1, k2;
- k1 = least_common_multiple / lhs.Denominator();
- int new_lhs_numerator = lhs.Numerator() * k1;
- k2 = least_common_multiple / rhs.Denominator();
- int new_rhs_numerator = rhs.Numerator() * k2;
- return { new_lhs_numerator - new_rhs_numerator, lhs.Denominator()*k1};
- }
- }
- bool operator==(const Rational& lhs, const Rational& rhs) {
- if ((lhs.Numerator() == rhs.Numerator()) && (lhs.Denominator() == rhs.Denominator()))
- return 1;
- else return 0;
- }
- Rational operator*(const Rational& lhs, const Rational& rhs) {
- int new_nominator = lhs.Numerator() * rhs.Numerator();
- int new_denominator = lhs.Denominator()*rhs.Denominator();
- return { new_nominator , new_denominator };
- }
- Rational operator/(const Rational& lhs, const Rational& rhs) { // (a/b) / (c/d) = (a * d) / (b * c)
- int new_nominator = lhs.Numerator() * rhs.Denominator();
- int new_denominator = lhs.Denominator() * rhs.Numerator();
- return { new_nominator , new_denominator };
- }
- ostream& operator<<(ostream& stream,const Rational& rational) {
- stream << rational.Numerator() << "/" << rational.Denominator();
- return stream;
- }
- istream& operator>>(istream& stream, Rational& rational) {
- int new_numerator, new_denominator;
- stream >> new_numerator;
- stream.ignore(1);
- stream >> new_denominator;
- rational = Rational(new_numerator, new_denominator);
- return stream;
- }
- int main() {
- {
- ostringstream output;
- output << Rational(-6, 8);
- if (output.str() != "-3/4") {
- cout << "Rational(-6, 8) should be written as \"-3/4\"" << endl;
- return 1;
- }
- }
- {
- istringstream input("5/7");
- Rational r;
- input >> r;
- bool equal = r == Rational(5, 7);
- if (!equal) {
- cout << "5/7 is incorrectly read as " << r << endl;
- return 2;
- }
- }
- {
- istringstream input("5/7 10/8");
- Rational r1, r2;
- input >> r1 >> r2;
- bool correct = r1 == Rational(5, 7) && r2 == Rational(5, 4);
- if (!correct) {
- cout << "Multiple values are read incorrectly: " << r1 << " " << r2 << endl;
- return 3;
- }
- input >> r1;
- input >> r2;
- correct = r1 == Rational(5, 7) && r2 == Rational(5, 4);
- if (!correct) {
- cout << "Read from empty stream shouldn't change arguments: " << r1 << " " << r2 << endl;
- return 4;
- }
- }
- cout << "OK" << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement