Wszystkie przykłady online dla operatorów trójskładnikowych mają po prostu metodę znalezienia największej liczby.
Czy możliwe jest opracowanie kodu znajdującego drugą największą liczbę 3 lub 4 liczb przy użyciu operatorów trójskładnikowych?
Odpowiedzi:
0 dla odpowiedzi № 1Możesz zdobyć drugą największą z 3 liczb (a
,b
i c
) przy użyciu operatora trójskładnikowego w następujący sposób:
int x = (a >= b && a >= c) ? ((b >= c) ? b : c) :
((b >= c) ? ((a >= c) ? a : c) : ((a >= b) ? a : b));
Chodzi o to, aby znaleźć, która jest największa, a następnie wybrać największą z pozostałych dwóch - największą wartość inną niż największa ze wszystkich trzech.
W powyższym, (a >= b && a >= c)
będzie prawdziwe jeśli a jest największy (większy niż b
i c
) ... Jeśli tak, wynik jest następujący ((b >= c) ? b : c)
, co daje większy z b
i c
.
Gdyby a
był nie największy oceniamy ((b >= c) ? ((a >= c) ? a : c) : ((a >= b) ? a : b))
. W tym, (b >= c)
sprawdza, czy b
jest największym z trzech (już wiemy a
nie jest, więc po prostu porównujemy b
i c
)... i jeśli b
jest największym z trzech, którego używamy ((a >= c) ? a : c)
zdobyć największy z a
i c
.
Jeśli nie a
ani b
jest więc największy c
musi być ... więc oceniamy ((a >= b) ? a : b)
zdobyć największy z a
i b
.
Ten sam wzór można rozszerzyć do czterech liczbzamiast trzech ... ale nawet z trzema robi się dość długo, i prawdopodobnie bardziej sensowne byłoby użycie (ewentualnie wbudowanej) funkcji za pomocą bardziej prostej metody.
0 dla odpowiedzi nr 2
Nie sądzę, że istnieje zbyt sprytna sztuczka, aby uzyskać drugą największą liczbę z operatorami trójskładnikowymi. Ale możesz użyć operacji trójskładnikowej, aby uzyskać najmniejszą liczbę:
int min(int a, int b) {
return (a < b)? a : b;
}
int secondLargest(int a, int b, int c) {
return (a < b && a < c)? min(b, c) :
(b < a && b < c)? min(a, c) :
min(a, b);
}
Dla 4 liczb możemy skorzystać z wcześniej zdefiniowanych funkcji:
int secondLargest(int a, int b, int c, int d) {
int minVar = (min(a, b), min(c, d))
return a == minVar? secondLargest(b, c, d) :
b == minVar? secondLargest(a, c, d) :
c == minVar? secondLargest(a, b, d) :
secondLargest(a, b, c) :
}
Możesz to utrzymać dla dowolnie dużej liczby zmiennych, ale w pewnym momencie sensowniej jest posortować je w tablicy, a następnie odczytać pozycję od ostatniej do ostatniej.