2014-09-19 5 views
5

mi sono imbattuto in una domanda intervista che recita come segue:C/C++ Macro per la ricerca di massimo di due numeri senza usare operatore ternario

"scrivere un semplice C/C++ Macro per trovare massimo di due numeri senza usare biblioteca std o operatore ternario ".

Ho bisogno del tuo aiuto per risolvere questo. So che è banale ma non sono riuscito a trovarlo. Quindi, pubblicandolo qui.

#include<iostream> 
#define max(x,y) /*LOGIC HERE*/ 
using namespace std; 

void main() 
{ 
    int a = 98453; 
    int b = 66394; 
    cout<<max(a,b); 
} 
+0

Vedere [risposta] (http://stackoverflow.com/questions/4772780/find-the-maximum-of-two-numbers-without-using-if-else-or-any-other-comparison-op?rq = 1) e questo codice 'C++' non verrà compilato in 'C++' compiler.main dovrebbe restituire 'int'. –

+0

Buon dolore .... –

+2

Ricorda, un'intervista è anche un modo per determinare se vuoi lavorare in quell'azienda. Se ottieni una domanda del genere, chiedi qualche domanda in cambio: è questo stile normale?I tuoi tecnici conoscono le differenze tra C e C++? Quanti avvisi non fissati ci sono nella tua base di codice? Quanto tempo dedichi a correggere i bug report sul campo rispetto all'implementazione di nuove funzionalità? – MSalters

risposta

26

operazioni booleane Usa per ottenere 0 o 1 e poi basta aggiungere li:

#define max(x,y) (((int)((x)<(y)) * (y)) + ((int)((y)<=(x)) * (x))) 
+0

E un altro +1 per usare i parenti come dovrebbero essere usati in una macro. –

+0

+1 Questa è semplicemente una risposta fantastica. –

3

#define max(x,y) (x+y + abs(x-y))/2 ti dà quello che state cercando. Funziona perché abs(x-y) = max(x,y) - min(x,y). Quindi, è possibile riscrivere l'espressione come segue

(x + y) + abs(x-y) = max(x,y) + min(x,y) + max(x,y) - min(x,y) 
        = 2*max(x,y) 

Come sottolineato nei commenti, utilizzando abs potrebbe violare le condizioni di quello che hai chiesto.

+0

Puoi darci un suggerimento su come funziona? Io non riesco a capire. È passato troppo tempo da quando ho studiato matematica. Una volta ho potuto risolvere i problemi di Calcolo nella mia testa. Ma ora ... sto invecchiando. –

+4

'abs()' sarebbe una funzione di libreria standard. –

2
#define max(x, y) x - ((x-y) & ((x-y) >> 31)) 

Questo presuppone x ed y sono 32 bit.

Questo funziona dal fatto che il bit più significativo di un numero negativo è 1.

Così se x-y è negativo (y è maggiore di x) allora x - (x - y) = y.

Se x-y è positivo allora x è maggiore di y, il bit più significativo è zero e quindi x - 0 = x.

Il numero 31 rappresenta il numero totale di bit della variabile - 1. (quindi il bit più significativo).

Immagino che questo sia quello che stanno cercando dato che non usa confronti.

+0

In C++ 5.8/3, per 'E1 >> E2'," Se E1 ha un tipo firmato e un valore negativo, il valore risultante è definito dall'implementazione ". –

+0

@Tony: È interessante pensare che una "implementazione" non utilizzi un 2s-Compliment per memorizzare un numero negativo, ma tali dettagli sono "sotto le copertine", proprio come l'endianità. Ti capita di avere un link a quella documentazione? – paiego

+0

sembra essere collegato da [questa domanda SO] (http://stackoverflow.com/questions/7238958/iso-c-standard-draft) - applausi. –

5
#include <iostream> 

#define max(x, y) [a = x, b = y](){ if (a<b) return b; else return a; }() 

int main() { 
    using namespace std; 

    int a = 10; 
    int b = 20; 
    cout << max(10, 20); 
    cout << max(a, b); 
}; 

una soluzione solo per divertimento:> compilato con C++ 14

sarebbe saltare in aria se x, y ha diversi tipi

+0

@TonyD Ho fatto un errore stupido @. @ – owensss

+1

Bello perché si presuppone solo che i tipi siano ordinati, nessun aritmetico assunto. Cioè funziona anche su iteratori forward. – MSalters

+1

Questa macro (AFAIK) non funziona su C. –

2

Aww, tante soluzioni piacevoli. Ho un altro sfruttando che booleani convertono a zero e uno:

#define CONDITION(c, t, f) (c * t + (1 - c) * f) 
#define MAX(a, b) CONDITION(a > b, a, b) 

nelle vicinanze, che sto volutamente ALL_UPPERCASING questo macchinario macro male. Direi che questo è il punto che dovresti aver sollevato in un'intervista.

1

un altro pazzo C++ 11-unico approccio, e barare un po 'con una struct dichiarazione supplementare (potrebbe usare un std::array se si lasciassero le librerie) - per tutto ciò che vale la pena (! Non molto) ...

struct Max { int n_[2]; }; 
#define max(x,y) (Max{(x),(y)}.n_[(x) < (y)])