2013-05-24 60 views
5

Đây là một câu hỏi khóa học giới thiệu đơn giản, nó được yêu cầu viết chương trình yêu cầu người dùng nhập 3 số và xác định số lớn nhất và nhỏ nhất. Chỉ sử dụng nếu câu lệnh. Tôi nghĩ về nó đã viết một cái gì đó như thế này, nhưng là nó có thể chỉ sử dụng 3 so sánh, hoặc ít hơn? Tôi nghĩ rằng khi y > largest, nó cũng cho chúng ta biết điều gì đó khác nữa?C++ Cách nhận số lớn nhất và nhỏ nhất

Đây là những gì tôi đã thử cho đến thời điểm này: yêu cầu 4 so sánh.

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

mẹo: bubbleort sẽ chỉ là ba so sánh và sẽ cho bạn biết min và max. –

+1

Trên thực tế, bubbleort thường hoán đổi để nó phức tạp hơn một số câu trả lời. [Nhưng đây là một bong bóng nội tuyến chưa được kiểm soát!] (Http://ideone.com/SGiYGu) –

Trả lời

10

Vấn đề với mã của bạn là bạn phải tung ra rất nhiều thông tin. Trong "thách thức" như thế này, bạn phải tận dụng tối đa những gì bạn có. Vì vậy, khi bạn nói, ví dụ:

if (y > largest) 

không chỉ xử lý trường hợp true. Cũng cố gắng lý do về trường hợp khi điều kiện không giữ.

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

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

Điều này chỉ chứa 3 so sánh.

+0

Tôi ' m khá chắc chắn nếu z là ba so sánh lớn nhất được thực hiện. –

+0

@MooingDuck ah vâng, bạn nói đúng. –

+0

@LuchianGrigore Tôi không biết nếu nó quan trọng, nhưng nếu nó chỉ là 'if statement', không có' else statement'. Nó cũng có thể được thực hiện trong 3 so sánh? – George

0

Nói chung bạn có thể xác định một loại cho ba số x, y, và z sử dụng so sánh tối đa 3:

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 

Vì vậy, việc các min cũng có thể được thực hiện với 3 so sánh.


Bạn có thể lấy tối thiểu trong 2 so sánh bằng cách thực hiện:

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

nơi min(a,b)a < b ? a : b.


Nói chung, bạn có thể lấy số phút N bằng cách sử dụng so sánh N - 1.

1

Tại sao bạn kiểm tra if (y < smallest)? Tại thời điểm này trong luồng, smallest phải là x, nhưng bạn đã kiểm tra nếu y > x trong điều kiện đầu tiên (if (y > largest)), vì vậy điều kiện thứ ba là dư thừa.

+0

Chắc chắn, chỉ cần bắt đầu với 'lớn nhất = y' thay vì' lớn nhất = x' và xem nơi bạn cần ... –

0

Tôi thấy điều này dễ hiểu nhất đối với bạn.

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

Đây là một điều thú vị và tôi tin rằng chức năng myabs thực sự là hành vi không xác định, nhưng tôi chỉ thấy những nơi mà nó hoạt động như mong đợi.

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; 
    } 

Kết quả đầu ra 0 2 chính xác với 0 so sánh trong tổng số.

+0

Nó chỉ hoạt động nếu 'long' là 64bit. Không quá nhiều nơi nó sẽ hoạt động. Tôi không bao giờ thấy những nơi như vậy, ví dụ – kotlomoy

+0

@ kotlomoy 'long' là 64 bit trên Linux, nhưng không phải Windows. Có định nghĩa cho các kiểu dữ liệu khác nhau cho Windows mà bạn có thể sử dụng để thay thế. Tôi không chắc nó là gì. – SirGuy

+0

@kotlomoy đã thay đổi 'long' thành' int64_t' được định nghĩa trong 'stdint.h'. Điều đó sẽ làm cho nó hoạt động trên Windows là tốt (không phải là tôi có thể kiểm tra, tuy nhiên) – SirGuy

1

Câu hỏi là tìm lớn nhất hoặc nhỏ nhất chỉ khi có câu lệnh khác và chúng tôi có ba biến để sử dụng, vì vậy chúng tôi chỉ cần hai so sánh.

{ 
    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. 
Các vấn đề liên quan