Run Code  | API  | Code Wall  | Misc  | Feedback  | Login  | Theme  | Privacy  | Patreon 

NWD, algorytm Euklidesa

/** PLIK JEST ZAPISANY W UTF-8 */
#include <utility>
#include <stdexcept>

/** back-end, nie sprawdza poprawności argumentów */
/*  Używać gdy jest się pewnym że podawane argumenty są nieujemne */
template<typename T>
T _NWD(T a, T b){
    /* dla mojej wygody chcę aby zmienna a przechowywała większą liczbę */
    if(a<b)
        std::swap(a, b); //zamienia `a` z `b`
    while(b!=0) {
        /* używam zmiannej tymczasowej aby uniknąć swappowania */
        /* reszta jest nie większa od `b`, a ja chcę
         * aby `a` przechowywała największą liczbę,
         * więc potrzebuję umieścić resztę w `b`,
         * ale zanim to zrobię, potrzebuję przenieść `b` do `a`,
         * aby nie utracić informacji którą przechowuje.
         */
        const T reszta = a%b;
        a = b;
        b = reszta;
    }
    return a;
}


template<typename T>
inline T NWD(const T a, const T b) {
    if(a<0 or b<0)
        throw std::invalid_argument("Co najmniej jeden z argumentow jest ujemny"); /*
                poniważ jest to szablon, argumenty nie muszą być liczbami! */
    return _NWD(a, b);
}

/* main został zmodyfikowany w stosunku do kodu który oddałem na sprawdzianie,
 * aby program działał dobrze tutaj, na Rextesterze
 */

/* Zadanie brzmi: mapisz funkcję.
 * Poniższy kod służy tylko do testów i domyślnie nie jest kompilowany*/
#ifdef DEBUG
#include <iostream>
int main(){
    std::clog << __cplusplus << std::endl;
    int a, b;
    while(std::cin >> a >> b){
        std::cout << "NWD(" << a << ", " << b << ")="<< NWD(a, b) << '\n';
    }
}
#endif
 run  | edit  | history  | help 0