Pătrat perfect și cub perfect

Există vreo funcție predefinită în c++ pentru a verifica dacă numărul este pătratul oricărui număr și la fel pentru cub...

Soluția

Nu, dar este ușor de scris unul:

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;
}
Comentarii (8)

sqrt(x), sau în general, pow(x, 1./2) sau pow(x, 1./3).

De exemplu:


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 
Comentarii (2)

Nu, nu există funcții standard c sau c++ pentru a verifica dacă un întreg este un pătrat perfect sau un cub perfect.

Dacă doriți să fie rapid și să evitați utilizarea rutinelor float/double menționate în majoritatea răspunsurilor, atunci codificați o căutare binară folosind numai numere întregi. Dacă puteți găsi un n cu n^2 < m < (n+1)^2, atunci m nu este un pătrat perfect. Dacă m este un pătrat perfect, atunci veți găsi un n cu n^2=m. Problema este discutată aici

Comentarii (0)

Încearcă asta:

#include
int isperfect(long n)
{
    double xp=sqrt((double)n);
    if(n==(xp*xp))
        return 1;
    else
        return 0;
}
Comentarii (0)

Pentru identificarea pătratelor am încercat acest algoritm în java. Cu o mică diferență de sintaxă, îl puteți face și în c++. Logica este că diferența dintre două pătrate perfecte consecutive crește cu 2. Diff(1,4)=3 , Diff(4,9)=5 , Diff(9,16)= 7 , Diff(16,25)= 9..... și așa mai departe. Putem folosi acest fenomen pentru a identifica pătratele perfecte. Codul Java este,

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

Pentru a face identificarea pătratelor mai rapidă putem folosi un alt fenomen, suma recursivă a cifrelor pătratelor perfecte este întotdeauna 1,4,7 sau 9. Deci, un cod mult mai rapid poate fi...

  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;

     }

  }
Comentarii (0)

Pentru pătrat perfect puteți face, de asemenea,:

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

Pentru cubul perfect se poate:

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

Sper să vă fie de ajutor.

Comentarii (1)

Am putea folosi funcția truc din dotare -

#include 

// 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));
}
Comentarii (0)