2013-05-24 14 views
5

Questa è una semplice domanda del corso introduttivo, ha chiesto di scrivere un programma che chiede all'utente di immettere 3 numeri e di determinare il numero più grande e più piccolo. Utilizzare solo se istruzione. Ho pensato di aver scritto qualcosa del genere, ma è possibile utilizzare solo 3 confronti, o meno? Penso che quando y > largest, ci dice anche qualcos'altro?C++ Come ottenere il più grande e il più piccolo

Questo è quello che ho provato finora: che ha richiesto 4 confronti.

int x, y, z; 
    int smallest, largest; 
    cout << "Please enter 3 numbers to compare: " ; 
    cin >> x >> y >> z; 

    smallest = x; 
    largest = x; 

    if (y > largest) 
      largest = y; 
    if (z > largest) 
      largest = z; 
    if (y < smallest) 
      smallest = y; 
    if (z < smallest) 
      smallest = z; 

    cout << "largest: " << largest << ", and smallest: " << smallest << endl; 
+2

tip: bubblesort sarebbe solo tre confronti, e dirvi il minimo e il massimo. –

+1

In realtà, bubblesort normalmente esegue swap in modo che sia più complesso di alcune delle risposte. [Ma ecco un bubblesort inline srotolato!] (Http://ideone.com/SGiYGu) –

risposta

10

Il problema con il codice è che si scaricano molte informazioni. In "sfide" come queste, devi sfruttare al massimo ciò che hai. Quindi, quando si dice, per esempio

if (y > largest) 

non solo trattare il caso true. Prova anche a ragionare sul caso quando la condizione non regge.

if (x < y) 
{ 
    smallest = x; 
    biggest = y; 
} 
else 
{ 
    smallest = y; 
    biggest = x; 
} 

if (z < smallest) 
    smallest = z; 
else if (z > biggest) 
    biggest = z; 

Questo contiene solo 3 confronti.

+0

I ' Sono abbastanza sicuro che se z è il più grande vengono eseguiti tre confronti. –

+0

@MooingDuck ah sì, hai ragione. –

+0

@LuchianGrigore Non so se è importante, ma se è solo 'if statement', no' else statement'. Può anche essere fatto in 3 confronto? – George

0

In generale è possibile determinare una sorta di tre numeri x, y, e z utilizzando al massimo 3 confronti:

if (x < y) 
    if (y < z) 
     //x,y,z -> x min 
    else if (x < z) 
     //x,z,y -> x min 
    else 
     //z,x,y -> z min 
else 
    if (z >= x) 
     //y,x,z -> y min 
    else if (z >= y) 
     //y,z,x -> y min 
    else 
     //z,y,x -> z min 

in modo da ottenere il minimo può essere fatto anche con 3 paragoni.


È possibile ottenere il minimo in 2 confronti facendo:

m = x; 
m = min(m,y); 
m = min(m,z); 

dove min(a,b) è a < b ? a : b.


In generale è possibile ottenere il numero minimo di N utilizzando i confronti N - 1.

1

Perché stai verificando if (y < smallest)? A questo punto del flusso, smallest deve essere x, ma hai già controllato se y > x nella prima condizione (if (y > largest)), quindi la terza condizione è ridondante.

+0

Certo, inizia con 'biggest = y' invece di' largest = x' e vedi dove ti porta ... –

0

Trovo che sia più facile da capire per te.

a = 5; 
b = 10; 
c = 15; 

//FIND MAX 
if (a >= b && a >= c) 
{ 
    max = a; 

} else 
{ 
    if (b >= c) 
     max = b 
    else 
     max = c; 
} 

//FIND MIN 
if (a <= b && a <= c) 
{ 

    min = a; 
} else 
{ 
    if (b <=c) 
     min = b; 
    else 
     min = c; 
} 
0

Questo è solo per divertimento e credo che la funzione myabs è in realtà dovrebbe essere un comportamento indefinito, ma ho sempre e solo posti che funziona come previsto visto.

double myabs(double x) 
    { 
     int64_t * p = (int64_t*)&x; 
     //clear sign bit 
     *p &= 0x7fffffffffffffff; 
     return x; 
    } 

    int main() 
    { 
     double x = 0, y = 1, z = 2; 
     //find max/min of first two numbers 
     double min = (myabs(x+y)-myabs(x-y))/2; 
     double max = (myabs(x+y)+myabs(x-y))/2; 
     //find max/min of previous max/min and third number 
     min = (myabs(min+z) - myabs(min-z))/2; 
     max = (myabs(max+z) + myabs(max-z))/2; 
     std::cout << min << ' ' << max << std::endl; 
     return 0; 
    } 

quali uscite 0 2 correttamente con 0 i confronti in totale.

+0

Funziona solo se 'long' è a 64 bit. Non troppi posti dove funzionerà. Non ho mai visto posti simili, ad esempio – kotlomoy

+0

@kotlomoy 'long' è 64 bit su Linux, ma non su Windows. Sono disponibili definizioni per diversi tipi di dati per Windows che è possibile utilizzare. Non sono sicuro di cosa sia, comunque, a dir poco. – SirGuy

+0

@kotlomoy ha cambiato 'lungo' in' int64_t' definito in 'stdint.h'. Questo dovrebbe farlo funzionare anche su Windows (non che sia in grado di testarlo, comunque) – SirGuy

1

La domanda è trovare il più grande o il più piccolo solo da istruzioni if ​​else, e abbiamo tre variabili da utilizzare, quindi abbiamo solo bisogno di due confronti.

{ 
    int valueOne, 
    valueTwo, 
    valueThree, 
    smallest; 

//User input for valueOne, valueTwo, valueThree. 

smallest = valueOne; 

if (smallest < valueTwo) 
{ 
smallest = valueTwo; 
} 
if (smallest < valueThree) 
{ 
smallest = valueThree; 
} 

//No matter what happens, smallest will have the smallest value now. 

//Use >, rather than <, and "largest" rather than "smallest" for finding largest value. 

//With this logic, you always will have one less comparison than the total number or variables to compare 

//i.e. 7 variables means 6 comparisons. 

//This contains only 2 comparisons. 
Problemi correlati