2009-10-11 12 views

उत्तर

13

नहीं है, लेकिन यह लिखने के लिए एक आसान है:

bool is_perfect_square(int n) { 
    if (n < 0) 
     return false; 
    int root(round(sqrt(n))); 
    return n == root * root; 
} 

bool is_perfect_cube(int n) { 
    int root(round(cbrt(n))); 
    return n == root * root * root; 
} 
+0

आप शून्य से संभावित विभाजन कहां देखते हैं? sqrt (0) और cbrt (0) परिभाषित हैं। –

+0

मेरे दिमाग में जो मूल जवाब था, वह 'n/root == root' वापस लौटा, लेकिन मैं एक अलग दृष्टिकोण का उपयोग कर समाप्त हुआ। इंगित करने के लिए धन्यवाद! जवाब संपादित करेंगे। –

+3

फ्लोटिंग-पॉइंट त्रुटि के कारण यह हमेशा काम नहीं करेगा: यदि 'sqrt()' या 'cbrt()' वास्तविक रूट से कम ईपीएसलॉन लौटने के लिए होता है, तो एक पूर्णांक में कास्ट उसको छोटा कर देगा, और चेक असफल। उसके खिलाफ पूरी तरह से बुलेट प्रूफ होने के लिए, आपको स्क्वायर रूट केस के लिए 'n == (रूट + 1) * (रूट + 1)' या फिर 'n == (root + 1) * (रूट) की जांच करने की आवश्यकता है + 1) * (रूट + 1) 'घन रूट मामले के लिए। –

6

sqrt(x), या सामान्य रूप में, pow(x, 1./2) या pow(x, 1./3)

के लिए उदाहरण:

int n = 9; 
int a = (int) sqrt((double) n); 
if(a * a == n || (a+1) * (a+1) == n) // in case of an off-by-one float error 
    cout << "It's a square!\n"; 

संपादित करें: या सामान्य रूप में:

bool is_nth_power(int a, int n) { 
    if(n <= 0) 
    return false; 
    if(a < 0 && n % 2 == 0) 
    return false; 
    a = abs(a); 

    int b = pow(a, 1./n); 
    return pow((double) b, n) == a || pow((double) (b+1), n) == a; 
} 
+2

समस्या (एक्स, 1./3)' कि 1/3, चल बिन्दु में एक सटीक प्रतिनिधित्व नहीं है तुम इतनी है वास्तव में "क्यूब रूट" नहीं हो रहा है। सी 99 के बाद 'cbrt' है, जो घन रूट प्राप्त करने का बेहतर काम करना चाहिए। मुझे लगता है कि –

+0

मुझे लगता है। लेकिन 'पाउ' सामान्यीकृत करता है, और फ़्लोटिंग पॉइंट त्रुटियों के लिए सही करना आसान है। –

1

इस प्रयास करें:

#include<math.h> 
int isperfect(long n) 
{ 
    double xp=sqrt((double)n); 
    if(n==(xp*xp)) 
     return 1; 
    else 
     return 0; 
} 
1

नहीं है, कोई मानक ग या C++ कि क्या एक पूर्णांक एक पूर्ण वर्ग या एक एकदम सही है की जाँच करने के कार्य इस प्रकार हैं घन।

यदि आप इसे तेज करना चाहते हैं और अधिकांश उत्तरों में उल्लिखित फ्लोट/डबल रूटीन का उपयोग करने से बचें, तो केवल पूर्णांक का उपयोग करके बाइनरी खोज को कोड करें। यदि आप n^2 < m < (n + 1)^2 के साथ n ढूंढ सकते हैं, तो एम एक पूर्ण वर्ग नहीं है। यदि एम एक पूर्ण वर्ग है, तो आपको n^2 = m के साथ एक n मिल जाएगा। समस्या पर चर्चा की गई है here

0

वर्गों की पहचान करने के लिए मैंने जावा में इस एल्गोरिदम की कोशिश की। थोड़ा वाक्यविन्यास अंतर के साथ आप इसे सी ++ में भी कर सकते हैं। तर्क यह है कि, प्रत्येक दो लगातार पूर्ण वर्गों के बीच का अंतर 2. बढ़ता जा रहा है। डिफ (1,4) = 3, डिफ (4, 9) = 5, डिफ (9, 16) = 7, डिफ (16, 25) = 9 ..... चला जाता है। हम इस वर्ग का उपयोग सही वर्गों की पहचान के लिए कर सकते हैं। जावा कोड, है

boolean isSquare(int num){ 
     int initdiff = 3; 
     int squarenum = 1; 
     boolean flag = false; 
     boolean square = false; 
     while(flag != true){ 

       if(squarenum == num){ 

        flag = true; 
        square = true; 

       }else{ 

        square = false; 
       } 
       if(squarenum > num){ 

        flag = true; 
       } 
      squarenum = squarenum + initdiff; 
      initdiff = initdiff + 2; 
    } 
       return square; 
} 

वर्गों की पहचान बनाने के लिए तेजी से हम एक और घटना का उपयोग कर सकते हैं, सही वर्गों के अंकों की पुनरावर्ती योग हमेशा 1,4,7 या 9. तो एक बहुत तेजी से कोड कर सकते हैं है हो ...

int recursiveSum(int num){ 
    int sum = 0; 
    while(num != 0){ 
    sum = sum + num%10; 
    num = num/10;   
    } 
    if(sum/10 != 0){   
     return recursiveSum(sum);  
    } 
    else{ 
     return sum; 
    } 

} 
    boolean isSquare(int num){ 
     int initdiff = 3; 
     int squarenum = 1; 
     boolean flag = false; 
     boolean square = false; 
     while(flag != true){ 

       if(squarenum == num){ 

        flag = true; 
        square = true; 

       }else{ 

        square = false; 
       } 
       if(squarenum > num){ 

        flag = true; 
       } 
      squarenum = squarenum + initdiff; 
      initdiff = initdiff + 2; 
    } 
       return square; 
} 

    boolean isCompleteSquare(int a){ 
    // System.out.println(recursiveSum(a)); 
    if(recursiveSum(a)==1 || recursiveSum(a)==4 || recursiveSum(a)==7 || recursiveSum(a)==9){ 

     if(isSquare(a)){ 

      return true; 

     }else{ 
      return false; 
     } 


    }else{ 

     return false; 


    } 

    } 
0

पूर्ण वर्ग के लिए आप भी कर सकते हैं:

if(sqrt(n)==floor(sqrt(n))) 
    return true; 
else 
    return false; 

पूर्ण घन आप कर सकते हैं के लिए:

0,123,
if(cbrt(n)==floor(cbrt(n))) 
    return true; 
else 
    return false; 

उम्मीद है कि इससे मदद मिलती है।

+0

_IF_ यह "वापसी के बारे में" था, क्यों न केवल 'sqrt (n) == floor (sqrt (n))' वापस लौटें? (और 'फर्श' को' राउंड 'क्यों पसंद करते हैं?) फिर,' int r = round (cbrt (n)) है; वापसी एन == आर * आर * आर' - इनमें से कोई भी 'पूर्वनिर्धारित' नहीं है, हमारे 2016 ज्ञान_ को नहीं छोड़ रहा है: [क्रिस 'उत्तर] (http://stackoverflow.com/a/1549960/3789665)। – greybeard

0

हम builtin truc समारोह इस्तेमाल कर सकते हैं - `पॉव उपयोग करने के साथ

#include <math.h> 

// For perfect square 
bool is_perfect_sq(double n) { 
    double r = sqrt(n); 
    return !(r - trunc(r)); 
} 

// For perfect cube 
bool is_perfect_cube(double n) { 
    double r = cbrt(n); 
    return !(r - trunc(r)); 
} 
संबंधित मुद्दे