TL: DR; Mã của bạn đã chính xác và "sạch".
Tôi thấy rất nhiều người vặn vẹo xung quanh câu trả lời nhưng tất cả mọi người đang bỏ lỡ khu rừng xuyên qua những tán cây. Chúng ta hãy làm khoa học máy tính và phân tích toán học đầy đủ để hiểu hoàn toàn câu hỏi này.
Đầu tiên, chúng tôi lưu ý rằng chúng tôi có 3 biến, mỗi biến có 3 trạng thái: <, = hoặc>. Tổng số hoán vị là 3 ^ 3 = 27 trạng thái, tôi sẽ chỉ định một số duy nhất, ký hiệu là P #, cho mỗi trạng thái. Số P # này là một hệ thống số giai thừa .
Liệt kê tất cả các hoán vị chúng ta có:
a ? b | a ? c | b ? c |P#| State
------+-------+-------+--+------------
a < b | a < c | b < c | 0| C
a = b | a < c | b < c | 1| C
a > b | a < c | b < c | 2| C
a < b | a = c | b < c | 3| impossible a<b b<a
a = b | a = c | b < c | 4| impossible a<a
a > b | a = c | b < c | 5| A=C > B
a < b | a > c | b < c | 6| impossible a<c a>c
a = b | a > c | b < c | 7| impossible a<c a>c
a > b | a > c | b < c | 8| A
a < b | a < c | b = c | 9| B=C > A
a = b | a < c | b = c |10| impossible a<a
a > b | a < c | b = c |11| impossible a<c a>c
a < b | a = c | b = c |12| impossible a<a
a = b | a = c | b = c |13| A=B=C
a > b | a = c | b = c |14| impossible a>a
a < b | a > c | b = c |15| impossible a<c a>c
a = b | a > c | b = c |16| impossible a>a
a > b | a > c | b = c |17| A
a < b | a < c | b > c |18| B
a = b | a < c | b > c |19| impossible b<c b>c
a > b | a < c | b > c |20| impossible a<c a>c
a < b | a = c | b > c |21| B
a = b | a = c | b > c |22| impossible a>a
a > b | a = c | b > c |23| impossible c>b b>c
a < b | a > c | b > c |24| B
a = b | a > c | b > c |25| A=B > C
a > b | a > c | b > c |26| A
Bằng cách kiểm tra chúng tôi thấy chúng tôi có:
- 3 trạng thái trong đó A là tối đa,
- 3 trạng thái trong đó B là tối đa,
- 3 trạng thái trong đó C là cực đại và
- 4 trạng thái trong đó A = B hoặc B = C.
Hãy viết một chương trình (xem chú thích) để liệt kê tất cả các hoán vị này với các giá trị cho A, B và C. Sắp xếp ổn định theo P #:
a ?? b | a ?? c | b ?? c |P#| State
1 < 2 | 1 < 3 | 2 < 3 | 0| C
1 == 1 | 1 < 2 | 1 < 2 | 1| C
1 == 1 | 1 < 3 | 1 < 3 | 1| C
2 == 2 | 2 < 3 | 2 < 3 | 1| C
2 > 1 | 2 < 3 | 1 < 3 | 2| C
2 > 1 | 2 == 2 | 1 < 2 | 5| ??
3 > 1 | 3 == 3 | 1 < 3 | 5| ??
3 > 2 | 3 == 3 | 2 < 3 | 5| ??
3 > 1 | 3 > 2 | 1 < 2 | 8| A
1 < 2 | 1 < 2 | 2 == 2 | 9| ??
1 < 3 | 1 < 3 | 3 == 3 | 9| ??
2 < 3 | 2 < 3 | 3 == 3 | 9| ??
1 == 1 | 1 == 1 | 1 == 1 |13| ??
2 == 2 | 2 == 2 | 2 == 2 |13| ??
3 == 3 | 3 == 3 | 3 == 3 |13| ??
2 > 1 | 2 > 1 | 1 == 1 |17| A
3 > 1 | 3 > 1 | 1 == 1 |17| A
3 > 2 | 3 > 2 | 2 == 2 |17| A
1 < 3 | 1 < 2 | 3 > 2 |18| B
1 < 2 | 1 == 1 | 2 > 1 |21| B
1 < 3 | 1 == 1 | 3 > 1 |21| B
2 < 3 | 2 == 2 | 3 > 2 |21| B
2 < 3 | 2 > 1 | 3 > 1 |24| B
2 == 2 | 2 > 1 | 2 > 1 |25| ??
3 == 3 | 3 > 1 | 3 > 1 |25| ??
3 == 3 | 3 > 2 | 3 > 2 |25| ??
3 > 2 | 3 > 1 | 2 > 1 |26| A
Trong trường hợp bạn đang tự hỏi làm thế nào tôi biết trạng thái P # nào là không thể, thì bây giờ bạn đã biết. :-)
Số lượng so sánh tối thiểu để xác định thứ tự là:
Nhật ký 2 (27) = Nhật ký (27) / Nhật ký (2) = ~ 4,75 = 5 so sánh
tức là coredump đã đưa ra đúng 5 số so sánh tối thiểu. Tôi sẽ định dạng mã của mình là:
status_t index_of_max_3(a,b,c)
{
if (a > b) {
if (a == c) return DONT_KNOW; // max a or c
if (a > c) return MOSTLY_A ;
else return MOSTLY_C ;
} else {
if (a == b) return DONT_KNOW; // max a or b
if (b > c) return MOSTLY_B ;
else return MOSTLY_C ;
}
}
Đối với vấn đề của bạn, chúng tôi không quan tâm đến việc kiểm tra sự bình đẳng để chúng tôi có thể bỏ qua 2 bài kiểm tra.
Không quan trọng mã sạch / xấu đến mức nào nếu nhận được câu trả lời sai vì vậy đây là một dấu hiệu tốt cho thấy bạn đang xử lý tất cả các trường hợp một cách chính xác!
Tiếp theo, để đơn giản, mọi người tiếp tục cố gắng "cải thiện" câu trả lời, trong đó họ nghĩ rằng cải thiện có nghĩa là "tối ưu hóa" số lượng so sánh, nhưng đó không hoàn toàn là những gì bạn đang hỏi. Bạn đã nhầm lẫn tất cả mọi người nơi bạn hỏi "Tôi cảm thấy có thể tốt hơn" nhưng không xác định "tốt hơn" nghĩa là gì. So sánh ít hơn? Ít mã hơn? So sánh tối ưu?
Bây giờ vì bạn đang hỏi về khả năng đọc mã (tính chính xác), tôi sẽ chỉ thực hiện một thay đổi đối với mã của bạn để dễ đọc: Căn chỉnh thử nghiệm đầu tiên với các thử nghiệm khác.
if (a > b && a > c)
status = MOSTLY_A;
else if (b > a && b > c)
status = MOSTLY_B;
else if (c > a && c > b)
status = MOSTLY_C;
else
status = DONT_KNOW; // a=b or b=c, we don't care
Cá nhân tôi sẽ viết nó theo cách sau nhưng điều này có thể quá không chính thống cho các tiêu chuẩn mã hóa của bạn:
if (a > b && a > c) status = MOSTLY_A ;
else if (b > a && b > c) status = MOSTLY_B ;
else if (c > a && c > b) status = MOSTLY_C ;
else /* a==b || b ==c*/status = DONT_KNOW; // a=b or b=c, we don't care
Lưu ý: Đây là mã C ++ để tạo các hoán vị:
#include <stdio.h>
char txt[] = "< == > ";
enum cmp { LESS, EQUAL, GREATER };
int val[3] = { 1, 2, 3 };
enum state { DONT_KNOW, MOSTLY_A, MOSTLY_B, MOSTLY_C };
char descr[]= "??A B C ";
cmp Compare( int x, int y ) {
if( x < y ) return LESS;
if( x > y ) return GREATER;
/* x==y */ return EQUAL;
}
int main() {
int i, j, k;
int a, b, c;
printf( "a ?? b | a ?? c | b ?? c |P#| State\n" );
for( i = 0; i < 3; i++ ) {
a = val[ i ];
for( j = 0; j < 3; j++ ) {
b = val[ j ];
for( k = 0; k < 3; k++ ) {
c = val[ k ];
int cmpAB = Compare( a, b );
int cmpAC = Compare( a, c );
int cmpBC = Compare( b, c );
int n = (cmpBC * 9) + (cmpAC * 3) + cmpAB; // Reconstruct unique P#
printf( "%d %c%c %d | %d %c%c %d | %d %c%c %d |%2d| "
, a, txt[cmpAB*2+0], txt[cmpAB*2+1], b
, a, txt[cmpAC*2+0], txt[cmpAC*2+1], c
, b, txt[cmpBC*2+0], txt[cmpBC*2+1], c
, n
);
int status;
if (a > b && a > c) status = MOSTLY_A;
else if (b > a && b > c) status = MOSTLY_B;
else if (c > a && c > b) status = MOSTLY_C;
else /* a ==b || b== c*/status = DONT_KNOW; // a=b, or b=c
printf( "%c%c\n", descr[status*2+0], descr[status*2+1] );
}
}
}
return 0;
}
Chỉnh sửa: Dựa trên phản hồi, di chuyển TL: DR lên đầu, xóa bảng chưa sắp xếp, làm rõ 27, xóa mã, mô tả trạng thái không thể.