2013-05-24 10 views
5

कैसे प्राप्त करें यह एक सरल परिचय पाठ्यक्रम प्रश्न है, इसने एक प्रोग्राम लिखने के लिए कहा जो उपयोगकर्ता को 3 नंबर इनपुट करने और सबसे बड़ी और छोटी संख्या निर्धारित करने के लिए कहता है। केवल कथन का उपयोग कर। मैंने सोचा कि इस तरह कुछ लिखा है, लेकिन क्या केवल 3 तुलना या कम उपयोग करना संभव है? मुझे लगता है कि y > largest, यह हमें कुछ और बताता है?सी ++ सबसे बड़ा और सबसे छोटा

यही मैंने अभी तक प्रयास किया है: जिसके लिए 4 तुलना की आवश्यकता है।

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

टिप: bubblesort केवल तीन तुलना होगा, और आप न्यूनतम और अधिकतम कहते थे। –

+1

असल में, बुलबुलार्ट सामान्य रूप से स्वैप करता है, इसलिए यह कुछ उत्तरों की तुलना में अधिक जटिल होगा। [लेकिन यहां एक अनियंत्रित इनलाइन बुलबुलार्ट है!] (Http://ideone.com/SGiYGu) –

उत्तर

10

आपके कोड के साथ समस्या यह है कि आप बहुत सारी जानकारी निकालते हैं। इन तरह की "चुनौतियों" में, आपको जो कुछ भी है, उसे सबसे अधिक बनाना होगा। तो जब आप कहते हैं, उदाहरण के लिए

if (y > largest) 

सिर्फ true मामले का इलाज नहीं है। स्थिति के बारे में भी तर्क देने की कोशिश करें जब स्थिति नहीं है।

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

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

यह केवल 3 तुलना में शामिल है।

+0

I ' मुझे यकीन है कि ज़ेड सबसे बड़ी तीन तुलना निष्पादित हो जाती है। –

+0

@MooingDuck आह हाँ, आप सही हैं। –

+0

@LuchianGrigore मुझे नहीं पता कि यह महत्वपूर्ण है, लेकिन यदि यह केवल 'अगर कथन' है, तो कोई और कथन नहीं है। क्या यह 3 तुलना में भी किया जा सकता है? – George

0

सामान्य तौर पर आप तीन नंबर x, y, और z ज्यादा से ज्यादा 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 

तो मिनट भी 3 तुलना साथ किया जा सकता हो रही। जहां min(a,b)a < b ? a : b है

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

:


आप ऐसा करके 2 तुलना में मिनट मिल सकता है।


सामान्य रूप से आप एन -1 तुलनाओं का उपयोग करके एन संख्याओं का न्यूनतम प्राप्त कर सकते हैं।

1

आप if (y < smallest) क्यों देख रहे हैं? प्रवाह में इस बिंदु पर, smallestx होना चाहिए, लेकिन आप पहले से ही y > x पहली स्थिति (if (y > largest)) में चेक कर चुके हैं, इसलिए तीसरी स्थिति अनावश्यक है।

+0

निश्चित रूप से, बस 'सबसे बड़ा = x' के बजाय' सबसे बड़ा = y' से शुरू करें और देखें कि यह आपको कहां लेता है ... –

0

मुझे आपके लिए समझने में यह आसान लगता है।

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

यह एक सिर्फ मनोरंजन के लिए है और मेरा मानना ​​है कि myabs समारोह वास्तव में अपरिभाषित व्यवहार माना जाता है, लेकिन मैं ही कभी स्थानों है कि यह काम करता है के रूप में उम्मीद देखा है।

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

कौन सा सही ढंग से 0 2 आउटपुट में कुल 0 तुलना के साथ।

+0

यह केवल तभी काम करता है जब 'long' 64 बिट है। बहुत सारे स्थान नहीं हैं जहां यह काम करेगा। मैंने कभी ऐसी जगहें नहीं देखीं, उदाहरण के लिए – kotlomoy

+0

@ कोटलोमोय 'लांग' लिनक्स पर 64 बिट्स है, लेकिन विंडोज़ नहीं। Windows के लिए अलग-अलग डेटा प्रकारों के लिए परिभाषित किया गया है जिनका उपयोग आप इसके बजाय कर सकते हैं। मुझे यकीन नहीं है कि यह क्या है हालांकि यह बंद है। – SirGuy

+0

@ kotlomoy 'stdint.h' में परिभाषित 'long' से' int64_t' बदल गया। इसे विंडोज़ पर भी काम करना चाहिए (नहीं कि मैं इसका परीक्षण करने में सक्षम हूं, हालांकि – SirGuy

1

प्रश्न केवल तभी और सबसे छोटे से सबसे छोटे या छोटे से ढूंढ रहे हैं, और हमारे पास उपयोग करने के लिए तीन चर हैं, इसलिए हमें केवल दो तुलना की आवश्यकता है।

{ 
    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. 
संबंधित मुद्दे