TL: DR; รหัสของคุณถูกต้องแล้วและ "สะอาด"
ฉันเห็นผู้คนมากมายเดินวนรอบคำตอบ แต่ทุกคนหายไปจากป่าผ่านต้นไม้ ลองทำวิทยาศาสตร์คอมพิวเตอร์เต็มรูปแบบและการวิเคราะห์ทางคณิตศาสตร์เพื่อทำความเข้าใจคำถามนี้อย่างสมบูรณ์
ก่อนอื่นเราทราบว่าเรามี 3 ตัวแปรแต่ละตัวมี 3 สถานะ: <, = หรือ> จำนวนพีชคณิตทั้งหมดคือ 3 ^ 3 = 27 รัฐซึ่งฉันจะกำหนดหมายเลขเฉพาะแทนด้วย P # สำหรับแต่ละรัฐ จำนวน P # นี่คือระบบเลขปัจจัย
ระบุพีชคณิตทั้งหมดที่เรามี:
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
โดยการตรวจสอบเราเห็นว่าเรามี:
- 3 สถานะโดยที่ A คือค่าสูงสุด
- 3 สถานะโดยที่ B คือค่าสูงสุด
- 3 สถานะโดยที่ C คือค่าสูงสุดและ
- 4 สถานะโดยที่ A = B หรือ B = C
ลองเขียนโปรแกรม (ดูเชิงอรรถ) เพื่อแจกแจงพีชคณิตทั้งหมดเหล่านี้ด้วยค่าสำหรับ A, B และ C เรียงลำดับอย่างเสถียรโดย 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
ในกรณีที่คุณสงสัยว่าฉันรู้ได้อย่างไรว่า P # state เป็นไปไม่ได้ตอนนี้คุณก็รู้แล้ว :-)
จำนวนขั้นต่ำของการเปรียบเทียบเพื่อพิจารณาคำสั่งซื้อคือ:
Log2 (27) = Log (27) / Log (2) = ~ 4.75 = 5 การเปรียบเทียบ
ie coredump ให้จำนวนการเปรียบเทียบน้อยที่สุด 5 อย่างถูกต้อง ฉันจะจัดรูปแบบรหัสของเขาเป็น:
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 ;
}
}
สำหรับปัญหาของคุณเราไม่สนใจเกี่ยวกับการทดสอบความเท่าเทียมกันดังนั้นเราจึงไม่สามารถทดสอบได้ 2 ครั้ง
มันไม่สำคัญว่าโค้ดจะสะอาด / ไม่ดีแค่ไหนหากได้รับคำตอบที่ผิดดังนั้นนี่เป็นสัญญาณที่ดีที่คุณจัดการทุกกรณีอย่างถูกต้อง!
ถัดไปสำหรับความเรียบง่ายผู้คนพยายาม "ปรับปรุง" คำตอบซึ่งพวกเขาคิดว่าการปรับปรุงหมายถึง "เพิ่มประสิทธิภาพ" จำนวนการเปรียบเทียบ แต่นั่นไม่ใช่สิ่งที่คุณต้องการอย่างเคร่งครัด คุณสับสนทุกคนที่คุณถามว่า "ฉันรู้สึกว่าอาจจะดีกว่า" แต่ไม่ได้นิยามว่า 'ดีกว่า' หมายถึงอะไร เปรียบเทียบน้อยลงหรือไม่ รหัสน้อยลงหรือไม่ การเปรียบเทียบที่ดีที่สุด?
ตอนนี้เมื่อคุณถามเกี่ยวกับความสามารถในการอ่านโค้ด (ได้รับความถูกต้อง) ฉันจะทำการเปลี่ยนแปลงหนึ่งเดียวกับโค้ดของคุณสำหรับความสามารถในการอ่าน: จัดการทดสอบครั้งแรกกับคนอื่น ๆ
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
โดยส่วนตัวแล้วฉันจะเขียนด้วยวิธีต่อไปนี้ แต่นี่อาจจะไม่เป็นไปตามมาตรฐานการเข้ารหัสของคุณเกินไป:
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
เชิงอรรถ: นี่คือรหัส C ++ เพื่อสร้างการเรียงสับเปลี่ยน:
#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;
}
การแก้ไข: ตามความคิดเห็นย้าย TL: DR ไปที่ด้านบนลบตารางที่ไม่เรียงลำดับออก 27 ฉบับล้างรหัสอธิบายสถานะที่เป็นไปไม่ได้