Diskuze: Největší společný dělitel

C++ C a C++ Největší společný dělitel

Avatar
Patrik
Neregistrovaný
Avatar
Patrik:

Ahojte,

pracuji na programu, který počítá více věcí a jednou z nich je největší společný dělitel. S touhle části bych potřeboval poradit. V jedné z části kódu nechápu co se děje tak kdyby mi to někdo objasnil byl bych rád :)

int nsd( int x, int y ) {

    int mensi = ( x <= y ) ? x : y;

    for ( int i = mensi; i > 0; i-- ) {
        if ( ( x % i == 0 ) && ( y % i == 0) ) {
            return i;
        }
    }

    return 1;
}

Teď myslím tu část:
int mensi = ( x <= y ) ? x : y;
Co naplňuje proměnou mensi? Jinak celkově kód mi funguje, jenom nechápu tuhle malou část. Díky za rady.

 
Odpovědět 10.11.2013 22:07
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Patrik
Jan Vargovský:

Říká se tomu ternární podmínka. Samotná podmínka je x<=y tak je menší x, pokud je větší x tak se přiřadí mensi = y. Pak jen vezmeš to menší číslo a dekrementuješ ho a testuješ, zdali když vydělíš čísla x a y číslem i, jestli je to 0. Pokud jo, tak je to největší společný dělitel. Pro příklad máš třeba 32 a 10

menší číslo je 10.
Takže jdeš od 10 k 1 a kontroluješ:
je 32/ 10 se zbytkem 0 ? není
je 32 / 9 se zbytkem 0 ? není
je 32 / 8 se zbytkem 0 ? je tak testuješ ještě druhé číslo. Je 10/8 se zbytkem 0 ? není
.
.
.
je 32 / 5 se zbytkem 0 ? není
je 32/4 se zbytkem 0 ? ano je. Tak testuješ druhé číslo 10/4 není se zbytkem 0.
32/3 není
32/2 je 10/2 je => NSD je 2.

 
Nahoru Odpovědět 10.11.2013 22:28
Avatar
Silvinios
Redaktor
Avatar
Silvinios:

Jde o ternární operátor pro podmíněný výraz. Dělá to to samé, co následující kód:

int mensi;
if ( x <= y ) {
  mensi = x;
} else {
  mensi = y;
}

Mimochodem k výpočtu NSD je lepší použít Euklidův algoritmus. Setkal jsi se s ním?

 
Nahoru Odpovědět  +1 10.11.2013 22:28
Avatar
Patrik
Neregistrovaný
Avatar
Patrik:

Jste super :) díky za rychlé a vyčerpávající odpovědi. Ale asi tam použiji ten Euklidův algoritmus jak píše Silvinios, to se mi bude lehčeji obhajovat. Jinak děkuji za váš čas a pěkný zbytek večera.

 
Nahoru Odpovědět 10.11.2013 23:08
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.