10
votes

Cube carré parfait et parfait

Y a-t-il une fonction prédéfinie en C ++ pour vérifier si le nombre est carré de tout nombre et identique pour le cube ..


0 commentaires

9 Réponses :


6
votes

sqrt (x) ou en général, pow (x, 1./2) ou pow (x, 1./3)

Par exemple: xxx

édition: ou en général: xxx


2 commentaires

Le problème avec l'utilisation pow (x, 1./3) est que 1/3 n'a pas de représentation exacte en virage flottant, de sorte que vous n'êtes donc pas "vraiment" à obtenir la racine du cube. C99 à partir de CBRT , qui devrait faire un meilleur travail d'obtenir la racine de cube.


Je suppose. Mais POW Généralisez plus facilement, et il est suffisamment facile de corriger les erreurs de points flottants.



20
votes

Non, mais il est facile d'écrire un: xxx


8 commentaires

Où voyez-vous une possible division par zéro? SQRT (0) et CBRT (0) sont définis.


La réponse originale que j'ai eu dans mon esprit a utilisé le retour n / root == racine , mais j'ai fini par utiliser une approche différente. Merci d'avoir souligné! Va éditer la réponse.


Cela ne fonctionnera pas toujours, en raison d'une erreur de point flottant: si sqrt () ou cbrt () arrive à retourner epsilon moins que la racine réelle, le casting à un Entier tronquera cela et le chèque échouera. Pour être complètement épreuve de balle contre cela, vous devez également vérifier si n == (root + 1) * (root + 1) pour le boîtier de racine carrée ou si n == ( Racine + 1) * (root + 1) * (root + 1) pour le boîtier de racine de cube.


Oh mon Dieu, ça me fait mal la tête. Je suis resté à la recherche de la fonction "racine" jusqu'à ce que je me rendais compte que vous veniez d'initialiser un entier ... Je n'aime pas fortement votre style de codage.


@Adam: Avez-vous un cas où un résultat "intégré" de sqrt ou cbrt se terminerait par "epsilon inférieur à la racine"? N'oubliez pas que nous ne traitons pas de fractions ici, donc (en supposant que la racine n'est pas si grosse qu'elle ne peut pas être représentée exactement par un numéro de point flottant, auquel cas nous avons déjà perdu), comment cela sera-t-il un problème? Je suis heureux d'utiliser rond () cependant.


@Mark: Vous ne pouvez pas aimer tout ce que vous voulez, mais c'est le style d'initialisation "plus standard" en C ++; Je pense que cela s'appelle «syntaxe du constructeur» ou quelque chose comme ça. C'est-à-dire que si vous construisez un objet qui, disons, prend plus d'un paramètre de constructeur, vous devez utiliser cette syntaxe de toute façon. Je n'aime pas faire une exception spéciale pour les types numériques, alors j'utilise également la syntaxe de constructeur pour eux.


Oh mon Dieu, je viens de rentrer à cette question et j'ai essayé de laisser le même commentaire, puis j'ai remarqué que quelqu'un d'autre a déjà fait, puis essayé de les upvouver mais ne pouvait pas trouver la flèche vers le haut, puis regardé l'utilisateur et j'ai compris que c'était moi. . Ne serait-il pas plus rapide de vérifier abs (racine-rond (root)) <= epsilon plutôt que de multiplier?


Ceci s'appelle une initialisation directe. Mais l'initialisation de la brace est préférée à l'aide de parenthèses, car elle élimine le problème de la plupart des analyses variables.



1
votes

Essayez ceci:

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


0 commentaires

2
votes

Non, il n'y a pas de fonctions C ou C ++ standard pour vérifier si un entier est un carré parfait ou un cube parfait.

Si vous voulez que ce soit rapide et évitez d'utiliser les routines flottantes / doubles mentionnées dans la plupart des réponses, codez une recherche binaire en utilisant uniquement des entiers. Si vous pouvez trouver un n avec n ^ 2 ici < / p>


0 commentaires

0
votes

Pour identifier les carrés, j'ai essayé cet algorithme en Java. Avec une faible différence de syntaxe, vous pouvez aussi le faire en C ++. La logique est, la différence entre tous les deux carrés parfaites consécutives augmente par 2. Diff (1,4) = 3, Diff (4,9) = 5, Diff (9,16) = 7, Diff (16,25 ) = 9 ..... continue. Nous pouvons utiliser ce phénomène pour identifier les carrés parfaits. Le code Java est,

  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 commentaires

-1
votes

Pour carré parfait, vous pouvez également faire: xxx

pour un cube parfait que vous pouvez: xxx

espère que cela aide.


2 commentaires

si ceci était "à propos de retour", pourquoi pas seulement retour SQRT (N) == étage (sqrt (n)) ? (et pourquoi préférer plancher à rond ?) Ensuite, il y a int r = rond (CBRT (n)); Retour n == R * R * R - Aucun de quoi est prédéfini , laissant pas à notre connaissance 2016 : Réponse dechris .


En raison de joints de points flottants, ce n'est pas un bon moyen de faire le chèque de cube. Cela échouera sur n == 27 : Essayez-le en ligne!



-1
votes

Nous pourrions utiliser le cas intégré TRUC fonction -

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


1 commentaires

La vérification de la racine de cube échoue sur 27.



1
votes

La réponse la plus efficace pourrait être celle-ci xxx

Cette méthode fonctionne en raison du fait que x est un int et il tombera dans la partie décimale pour stocker uniquement la partie entière. Si un numéro est parfait carré d'un entier, sa racine carrée sera un entier et donc x et sqrt (x) sera égale.


0 commentaires

-2
votes
bool isSquare(int n) {
    return floor(sqrt(n)) == ceil(sqrt(n));
}

bool isQube(int n) {
    return floor(cbrt(n)) == ceil(cbrt(n));
}

2 commentaires

Votre vérificateur racinaire de cube échoue à certaines valeurs, telles que 27.


S'il vous plaît ne postez pas uniquement de code comme réponse, mais fournissez également une explication de votre code et de la manière dont il résout le problème de la question. Les réponses avec une explication sont généralement plus utiles et de meilleure qualité, et sont plus susceptibles d'attirer des upvotes.