2011-02-03 12 views
16

संभव डुप्लिकेट:
What's a good algorithm to determine if an input is a perfect square?सही स्क्वायर की जांच करने का सबसे छोटा तरीका?

मैं सबसे छोटा और सबसे आसान तरीका चाहते हैं एक नंबर की जाँच करें करने के लिए सी # में पूर्ण वर्ग है

बिल्कुल सही वर्गों में से कुछ :

1, 4, 9, 16, 25, 36, 49, 64, 81, 100, ...... 
+0

@dogbane यही सवाल dup के रूप में बंद कर दिया है: डी –

उत्तर

32

शायद जांच कर रहा है कि संख्या के वर्ग रूट में कोई दशमलव भाग है, या यदि यह पूरी संख्या है।

double result = Math.Sqrt(numberToCheck); 
bool isSquare = result%1 == 0; 

isSquare अब अन्य सभी के लिए सभी वर्गों के लिए true, और false होना चाहिए:

Implementationwise, मैं कुछ इस तरह की सोच सकते हैं।

+8

+1: मैं हैरान हूँ कि% ऑपरेटर युगल –

+8

ऊपर जवाब पर काम करता है था बड़ी संख्या के साथ हमेशा सही नहीं है। इसके साथ प्रयास करें: डबल परिणाम = Math.Sqrt (39 99680306388005621); बूल isSquare = परिणाम% 1 == 0; लंबा एक्स = (लंबा) परिणाम; लांग वाई = एक्स * एक्स; // y 3999680306388005621 –

+0

मुझे यकीन नहीं है लेकिन यह तब हो सकता है जब संख्या परिशुद्धता/फ़्लोटिंग पॉइंट खोने लगती है? – Luke

0
public bool IsPerfectSquare(int num) 
{ 
    int root = (int)Math.Sqrt(num); 
    return (int) Math.Pow(root,2) == num; 
} 
4

यह अगर वर्गमूल अभिन्न अंग है की जाँच पर एक संस्करण है:

bool IsPerfectSquare(double input) 
{ 
    var sqrt = Math.Sqrt(input); 
    return Math.Abs(Math.Ceiling(sqrt) - Math.Floor(sqrt)) < Double.Epsilon; 
} 

Math.Ceiling जबकि Math.Floor नीचे दौर होगा, अगले पूर्णांक में इसे राउंड होगा। अगर वे वही हैं, तो आपके पास एक पूर्णांक है!

यह भी एक oneliner के रूप में लिखा जा सकता है:

if (int(Math.Ceiling(Math.Sqrt(n))) == int(Math.Floor(Math.Sqrt(n)))) /* do something */; 
+2

'गणित। छत() 'और' Math.Floor()' एक डबल मान लौटाता है, इसलिए आप यहां संभावित मुद्दों पर चले जाएंगे। इसके बजाए, एक फ़्लोटिंग पॉइंट तुलना करें: 'अगर (Math.Abs ​​(val1 - value2) michael

+0

@ माइकल, धन्यवाद, यह एक बहुत अच्छा मुद्दा है! मैंने इसे प्रतिबिंबित करने के लिए अपना जवाब अपडेट कर दिया है! –

+0

'> 0' के बजाय'

1
public bool IsPerferctSquare(uint number) 
    { 
     return (Math.Sqrt(number) % 1 == 0); 
    } 
संबंधित मुद्दे