Przy omawianiu algorytmów operujących na ułamkach wykorzystamy algorytm Euklidesa opisany w tym miejscu oraz algorytm NWW - najmniejsza wspólna wielokrotność.
Załóżmy, że chcemy dodać (odjąć) do siebie dwa ułamki zwykłe przedstawione w postaci bez całości. Pamiętamy ze szkoły podstawowej, że należy sprowadzić je do wspólnego mianownika wyznaczając najmniejszą wspólną wielokrotność, następnie rozszerzamy każdy z ułamków o brakujący czynnik. Na końcu dodajemy (odejmujemy) liczniki a mianowniki spisujemy.
Przykład:
$$\frac{3}{7}+\frac{6}{5}=\cdots$$
Teraz rozszerzamy ułamki wyznaczając $$NWW(7,5)=35$$ a następnie rozszerzamy pierwszy ułamek o $$NWW(7,5)/7 = 5$$ a drugi o $$NWW(7,5)/5 = 7$$
$$=\frac{3\cdot 5}{7\cdot 5}+\frac{6\cdot 7}{5\cdot 7}=\frac{57}{35}$$
W ostatnim kroku skracamy ułamek dzieląc licznik i mianownik przez $$NWD(licznik, mianownik)$$. W tym przykładzie $$NWD(77,35)=7$$, a więc:
$$\frac{77/NWD(77,35)}{35/NWD(77,35)}=\frac{11}{7}$$
Rozwiązanie w C++:
//algorytm.edu.pl
#include<iostream>
using namespace std;
int NWD(int a, int b)
{
int pom;
while(b!=0)
{
pom = b;
b = a%b;
a = pom;
}
return a;
}
int NWW(int a, int b)
{
return a/NWD(a,b)*b;
}
int main()
{
int l1, l2, m1, m2; //liczniki i mianowniki
char kreska;
cout<<"Podaj pierwszy ułamek w formacie licznik/mianownik: ";
cin>>l1>>kreska>>m1;
cout<<"Podaj drugi ułamek w formacie licznik/mianownik: ";
cin>>l2>>kreska>>m2;
int licznik, mianownik; //licznik i mianownik ułamka wynikowego
mianownik = NWW(m1, m2);
int pom = licznik = mianownik/m1*l1 + mianownik/m2*l2;
licznik /= NWD(pom,mianownik);
mianownik /= NWD(pom,mianownik);
cout<<l1<<"/"<<m1<<" + "<<l2<<"/"<<m2<<" = "<<licznik<<"/"<<mianownik;
return 0;
}
Mnożenie ułamków jest znacznie prostszą operacją, ponieważ wystarczy pomnożyć przez siebie liczniki i mianowniki, a następnie wyznaczyć $$n=NWD(licznik,mianownik0$$ i skrócić przez liczbę $$n$$ powstały w wyniku mnożenia licznik i mianownik.