Clasa a X-a · Tipul structRead in English

Operații cu fracții în C++

În engleză: Operations with fractions

O(log n)C++1782 de linii2 exemple

Ideea

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.

Descrierea în engleză

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.

Complexitate
O(log(numitor)) pentru simplificare
Clasa
Clasa a X-a (Grade 10)

Exemple

Exemplul 1

Intrare

1 2 1 3

Ieșire așteptată

5/6
1/6
Exemplul 2

Intrare

3 4 5 6

Ieșire așteptată

19/12
5/8

Codul C++

Codul complet, cu comentarii în română. Îl poți modifica liber și îl poți reseta oricând.

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;
}

Rulează pe un g++ adevărat (C++17, -O2) prin Compiler Explorer. Programele trebuie să se termine repede: există o limită de timp.