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 .. p>
9 Réponses :
Par exemple: p> édition: ou en général: p> sqrt (x) code> ou en général,
pow (x, 1./2) code> ou
pow (x, 1./3) Code>
Le problème avec l'utilisation pow (x, 1./3) code> 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 code>, qui devrait faire un meilleur travail d'obtenir la racine de cube.
Je suppose. Mais POW code> Généralisez plus facilement, et il est suffisamment facile de corriger les erreurs de points flottants.
Non, mais il est facile d'écrire un:
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 code>, 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 () code> ou
cbrt () code> 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) code> pour le boîtier de racine carrée ou si
n == ( Racine + 1) * (root + 1) * (root + 1) code> 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 code> ou
cbrt code> 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 () code> 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 code> 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.
Essayez ceci:
#include<math.h> int isperfect(long n) { double xp=sqrt((double)n); if(n==(xp*xp)) return 1; else return 0; }
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. P>
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
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; } }
Pour carré parfait, vous pouvez également faire: pour un cube parfait que vous pouvez: p> espère que cela aide. P > p>
si i> ceci était "à propos de retour", pourquoi pas seulement retour SQRT (N) == étage (sqrt (n)) code>? (et pourquoi préférer
plancher code> à
rond code>?) Ensuite, il y a
int r = rond (CBRT (n)); Retour n == R * R * R CODE> - Aucun de quoi est
prédéfini code>, laissant pas à notre connaissance 2016 i>: 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 code>: Essayez-le en ligne!
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)); }
La vérification de la racine de cube échoue sur 27.
La réponse la plus efficace pourrait être celle-ci 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. P> p>
bool isSquare(int n) { return floor(sqrt(n)) == ceil(sqrt(n)); } bool isQube(int n) { return floor(cbrt(n)) == ceil(cbrt(n)); }
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.