Grade 10 · The struct typeCitește în română

Operations with fractions

Original: Operații cu fracții

O(log n)C++1782 lines2 examples

The idea

A fraction has two fields, the numerator a and the denominator b, so we represent it with struct Fractie { long long a, b; }. A function can return a whole structure, so aduna(x, y) and inmulteste(x, y) return the resulting fraction directly. simplifica(f) receives the fraction by reference and divides it by gcd(a, b). Formulas: a/b + c/d = (ad + bc)/bd and a/b * c/d = ac/bd. Two fractions are read; their sum and product are printed.

Original description (Romanian)

O fracție are două câmpuri, numărătorul a și numitorul b, deci o reprezentăm cu struct Fractie { long long a, b; }. O funcție poate întoarce o structură întreagă, așa că aduna(x, y) și inmulteste(x, y) întorc direct fracția rezultat. simplifica(f) primește fracția prin referință și o împarte la cmmdc(a, b). Formule: a/b + c/d = (ad + bc)/bd și a/b * c/d = ac/bd. Se citesc două fracții, se afișează suma și produsul.

Complexity
O(log(denominator)) for the simplification
Grade
Grade 10 (Clasa a X-a)

Examples

Example 1

Input

1 2 1 3

Expected output

5/6
1/6
Example 2

Input

3 4 5 6

Expected output

19/12
5/8

The code

Comments are in Romanian, as in the original collection. Edit freely: you can reset at any time.

operatii-cu-fractii.cpp
/*
 * Titlu: Operații cu fracții
 * Clasa: 10
 * Capitol: Tipul struct
 * Descriere: O fracție are două câmpuri, numărătorul a și numitorul b, deci o
 *            reprezentăm cu struct Fractie { long long a, b; }. O funcție poate
 *            întoarce o structură întreagă, așa că aduna(x, y) și inmulteste(x, y)
 *            întorc direct fracția rezultat. simplifica(f) primește fracția prin
 *            referință și o împarte la cmmdc(a, b). Formule: a/b + c/d = (ad + bc)/bd
 *            și a/b * c/d = ac/bd. Se citesc două fracții, se afișează suma și produsul.
 * Complexitate: O(log(numitor)) pentru simplificare
 *
 * Exemplu
 * Intrare: 1 2 1 3
 * Ieșire:
 * 5/6
 * 1/6
 *
 * Exemplu
 * Intrare: 3 4 5 6
 * Ieșire:
 * 19/12
 * 5/8
 */
#include <iostream>
using namespace std;

struct Fractie
{
    long long a, b;   // a = numărător, b = numitor
};

long long cmmdc(long long x, long long y)
{
    while (y != 0)
    {
        long long r = x % y;
        x = y;
        y = r;
    }
    return x;
}

void simplifica(Fractie &f)
{
    long long d = cmmdc(f.a, f.b);
    f.a /= d;
    f.b /= d;
}

Fractie aduna(Fractie x, Fractie y)
{
    Fractie r;
    r.a = x.a * y.b + y.a * x.b;
    r.b = x.b * y.b;
    simplifica(r);
    return r;
}

Fractie inmulteste(Fractie x, Fractie y)
{
    Fractie r;
    r.a = x.a * y.a;
    r.b = x.b * y.b;
    simplifica(r);
    return r;
}

void afiseaza(Fractie f)
{
    cout << f.a << '/' << f.b << '\n';
}

int main()
{
    Fractie x, y;
    cin >> x.a >> x.b >> y.a >> y.b;
    afiseaza(aduna(x, y));
    afiseaza(inmulteste(x, y));
    return 0;
}

Runs on a real g++ (C++17, -O2) through Compiler Explorer. Keep runs short; there's a time limit.