Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cmath>
- #include <utility>
- using namespace std;
- int NOD(int a, int b) {
- a = abs(a);
- b = abs(b);
- while (a && b) {
- if (a > b) {
- a %= b;
- } else {
- b %= a;
- }
- }
- return a + b;
- }
- class Rational {
- private:
- int num = 0;
- int den = 1;
- public:
- Rational() {}
- Rational(int num, int den) {
- if (den < 0) {
- num *= -1;
- den *= -1;
- }
- int nod = NOD(num, den);
- num /= nod;
- den /= nod;
- this->num = num;
- this->den = den;
- }
- Rational(int num) {
- this->num = num;
- this->den = 1;
- }
- int numerator() const {
- return num;
- }
- int denominator() const {
- return den;
- }
- Rational& reduce() {
- if (den < 0) {
- num *= -1;
- den *= -1;
- }
- int nod = NOD(num, den);
- num /= nod;
- den /= nod;
- return *this;
- }
- Rational& operator += (const Rational& rat) {
- Rational r;
- r.num = num * rat.denominator() + den * rat.numerator();
- r.den = den * rat.denominator();
- *this = move(r);
- this->reduce();
- return *this;
- }
- Rational& operator -= (const Rational& rat) {
- Rational r;
- r.num = num * rat.denominator() - den * rat.numerator();
- r.den = den * rat.denominator();
- *this = move(r);
- this->reduce();
- return *this;
- }
- Rational& operator *= (const Rational& rat) {
- num *= rat.numerator();
- den *= rat.denominator();
- this->reduce();
- return *this;
- }
- Rational& operator /= (const Rational& rat) {
- int old_num = rat.numerator();
- int old_den = rat.denominator();
- num *= old_den;
- den *= old_num;
- this->reduce();
- return *this;
- }
- Rational& operator ++() {
- num += den;
- this->reduce();
- return *this;
- }
- Rational operator ++(int) {
- Rational r = *this;
- ++(*this);
- return r;
- }
- Rational& operator --() {
- num -= den;
- this->reduce();
- return *this;
- }
- Rational operator --(int) {
- Rational r = *this;
- --(*this);
- return r;
- }
- Rational operator + () const {
- return *this;
- }
- Rational operator - () const {
- Rational result(-num, den);
- return result;
- }
- };
- bool operator == (const Rational& rat1, const Rational& rat2) {
- return ((rat1.numerator() == rat2.numerator()) && (rat1.denominator() == rat2.denominator()));
- }
- bool operator != (const Rational& rat1, const Rational& rat2) {
- return ((rat1.numerator() != rat2.numerator()) || (rat1.denominator() != rat2.denominator()));
- }
- Rational operator + (const Rational& rat1, const Rational& rat2) {
- Rational result = rat1;
- return result += rat2;
- }
- Rational operator - (const Rational& rat1, const Rational& rat2) {
- Rational result = rat1;
- return result -= rat2;
- }
- Rational operator * (const Rational& rat1, const Rational& rat2) {
- Rational result = rat1;
- return result *= rat2;
- }
- Rational operator / (const Rational& rat1, const Rational& rat2) {
- Rational result = rat1;
- return result /= rat2;
- }
- #include <vector>
- #include <iostream>
- void printv(std::vector<Rational> v) {
- for (auto& i : v) {
- std::cout << i.numerator() << "/" << i.denominator() << " ";
- }
- std::cout << '\n';
- }
- Rational pr(std::vector<Rational> v1, std::vector<Rational> v2) {
- Rational ans = 0;
- for (int i = 0; i < v1.size(); ++i) {
- ans += v1[i] * v2[i];
- }
- return ans;
- }
- std::vector<Rational> sc(Rational r, std::vector<Rational> v) {
- for (auto& i : v) {
- i *= r;
- }
- return v;
- }
- std::vector<Rational> minu(std::vector<Rational> v1, std::vector<Rational> v2) {
- for (int i = 0; i < v1.size(); ++i) {
- v1[i] -= v2[i];
- }
- return v1;
- }
- std::vector<Rational> g_smitd(std::vector<Rational> v1, std::vector<Rational> v2) {
- return sc((pr(v1, v2) / pr(v1, v1)), v1);
- }
- void prn(Rational r) {
- std::cout << r.numerator() << "/" << r.denominator() << ' ';
- }
- int main() {
- std::vector<Rational> v1 = { 4, -1, -2, -2 };
- std::vector<Rational> v2 = { 0, 1, 0, 0 };
- std::vector<Rational> v3 = { 0, 0, 1, 0 };
- std::vector<Rational> v4 = { 0, 0, 0, 1 };
- v2 = minu(v2, g_smitd(v1, v2));
- auto v5 = minu(minu(v3, g_smitd(v1, v3)), g_smitd(v2, v3));
- v3 = v5;
- auto v6 = minu(minu(minu(v4, g_smitd(v1, v4)), g_smitd(v2, v4)), g_smitd(v3, v4));
- v4 = v6;
- prn(pr(v1, v1));
- std::cout << '\n';
- prn(pr(v2, v2));
- std::cout << '\n';
- prn(pr(v3, v3));
- std::cout << '\n';
- prn(pr(v4, v4));
- std::cout << '\n';
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement