Portál AbcLinuxu, 12. května 2025 03:53

Dotaz: c++ zkrácení zlomku

9.1.2013 19:25 marek33
c++ zkrácení zlomku
Přečteno: 1289×
Odpovědět | Admin
Ahoj, mam tady takovou úlohu a nevím si s ni rady. Mam zlomek 6/4 a mam ho zkrátit na 3/2, chtěl bych to udělat pomocí cyklu while. Díky za vaší pomoc.

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

9.1.2013 19:53 ?
Rozbalit Rozbalit vše Re: c++ zkrácení zlomku
Odpovědět | | Sbalit | Link | Blokovat | Admin
#include <iostream>

int find_gcd(int a, int b)
{
    return b == 0 ? a : find_gcd(b, a % b);
}

int main(int argc, char **argv)
{
    int numerator = 6;
    int denominator = 4;
    int gcd = 1;

    while ((gcd = find_gcd(numerator, denominator)) != 1)
    {
        numerator /= gcd;
        denominator /= gcd;
    }

    std::cout<<numerator <<"/" <<denominator <<std::endl;

    return 0;
}    
10.1.2013 10:47 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: c++ zkrácení zlomku
Tak tady je ten while cyklus opravdu zásadní… :-)
10.1.2013 11:09 l4m4
Rozbalit Rozbalit vše Re: c++ zkrácení zlomku
Na požadavek udělat to pomocí while cyklu je to myslím adekvátní reakce...
10.1.2013 11:27 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: c++ zkrácení zlomku
To ovšem vede k otázce, co ještě lze považovat za "udělat pomocí". Tohle už mi připadá, jako kdyby zadáním bylo sestavit skříňku pomocí šroubováku a v řešení byl šroubovák použit jen k zatížení plánku, aby ho neodfoukl vítr. Nebo spíš ještě hůř, protože tady je cyklus použit tak nesmyslným způsobem, že pokud vstupní hodnoty nejsou nesoudělné, bude se find_gcd() úplně zbytečně volat podruhé. Takže ten cyklus jen překáží, kdyby tam místo while bylo napsáno if, bude kód fungovat také a navíc bude efektivnější.
Jendа avatar 10.1.2013 16:34 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: c++ zkrácení zlomku
while ((gcd = find_gcd(numerator, denominator)) != 1)
Vy mě fakt jednou zabijete! :-D :-D
Takže ten cyklus jen překáží, kdyby tam místo while bylo napsáno if, bude kód fungovat také a navíc bude efektivnější.
Ale nebude splněno zadání Pomocí cyklu while…
10.1.2013 16:53 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: c++ zkrácení zlomku
Tak by se dal cyklus do té funkce find_gcd() místo machrování s rekurzí a doufání, že z ní překladač ten cyklus udělá…
10.1.2013 11:59 monika
Rozbalit Rozbalit vše Re: c++ zkrácení zlomku
ahoj,

jak tak na to koukám, proč je proměnná gcd = 1 inicializovaná na hodnotu 1? Vždyt se v cyklu pořád přepisuje.
10.1.2013 12:07 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: c++ zkrácení zlomku
Ne víc než dvakrát (ale i to je o jednou víc, než je potřeba).
10.1.2013 12:10 monika
Rozbalit Rozbalit vše Re: c++ zkrácení zlomku
ok, pro pevně dané hodnoty jednoho zlomku. Ale stejně mi není jasné proč je ta proměnná inicializovaná zrovna na jedničku.
10.1.2013 12:42 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: c++ zkrácení zlomku
ok, pro pevně dané hodnoty jednoho zlomku

Pro kterékoli hodnoty.

Ale stejně mi není jasné proč je ta proměnná inicializovaná zrovna na jedničku.

Ono je úplně jedno, na co je inicializovaná (a jestli vůbec), protože první použití té proměnné je stejně přiřazení do ní. Takže nemá ani smysl hloubat nad tím, proč ta či ona hodnota.

10.1.2013 12:46 monika
Rozbalit Rozbalit vše Re: c++ zkrácení zlomku
Jasně, pro jekékoliv hodnoty, ale v příkladu, který uvádíte, jsou pevně dány jen jeden čitatel a jeden jmenovatel. Aha, já myslela, že to má nějaký speciální význam ta jednička, tak jsem nad tím dumala :))
10.1.2013 12:58 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: c++ zkrácení zlomku
Základní chyba byla možná v předpokladu, že to řešení je dobře napsané. Ono je bohužel dobře jen v tom smyslu, že poskytuje správný výsledek.
9.1.2013 19:55 chrono
Rozbalit Rozbalit vše Re: c++ zkrácení zlomku
Odpovědět | | Sbalit | Link | Blokovat | Admin
V tom cykle while sa nájde najväčší spoločný deliteľ (pomocou Euklidovho algoritmu) a potom sa čitateľ a menovateľ tým číslom jednoducho vydelí. :)
9.1.2013 20:16 marek33
Rozbalit Rozbalit vše Re: c++ zkrácení zlomku
díky, přesně to sem myslel
9.1.2013 21:02 Sten
Rozbalit Rozbalit vše Re: c++ zkrácení zlomku
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pro počítání se zlomky je dobrý Boost Math Rational

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.