Perfekter Platz und perfekter Würfel
-
20-09-2019 - |
Frage
Gibt es eine vordefinierte Funktion in C ++ zu überprüfen, ob die Nummer Quadrat einer Zahl und gleich für den Würfel ..
Lösung
Nein, aber es ist einfach zu schreiben:
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;
}
Andere Tipps
sqrt(x)
, oder im Allgemeinen, pow(x, 1./2)
oder pow(x, 1./3)
Zum Beispiel:
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";
Edit: oder allgemein:
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;
}
Versuchen Sie diese:
#include<math.h>
int isperfect(long n)
{
double xp=sqrt((double)n);
if(n==(xp*xp))
return 1;
else
return 0;
}
Nein, es gibt kein Standard-C oder C ++ Funktionen zu prüfen, ob eine ganze Zahl ist ein perfektes Quadrat oder ein perfekter Würfel.
Wenn Sie es wollen, schnell und vermeiden sein erwähnten mit dem Float / Double-Routinen in den meisten Antworten, Code dann eine binäre Suche nur ganze Zahlen verwendet. Wenn Sie eine n mit n ^ 2
Für Quadrate identifiziert habe ich versucht, diesen Algorithmus in Java. Mit wenig Syntax Unterschied können Sie es in C ++ tun zu. Die Logik ist, wird die Differenz zwischen jeweils zwei aufeinander folgenden Quadrate perfekte vergeht 2. Diff auf die Erhöhung (1,4) = 3, Diff (4,9) = 5, Diff (9,16) = 7, Diff (16,25 ) = 9 ..... geht weiter. Wir können dieses Phänomen Einsatz die richtigen Plätze zu identifizieren. Java-Code ist,
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;
}
Um die Identifizierung der Quadrate schneller machen wir ein anderes Phänomen verwenden können, die rekursive Summe der Stellen von Quadratzahlen ist immer 1,4,7 oder 9. So viel Code schneller kann ...
sein 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;
}
}
Für den perfekten Platz können Sie auch tun:
if(sqrt(n)==floor(sqrt(n)))
return true;
else
return false;
Für den perfekten Würfel können Sie:
if(cbrt(n)==floor(cbrt(n)))
return true;
else
return false;
Hope, das hilft.
Wir könnten die builtin benutzen truc Funktion -
#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));
}
Die effizienteste Antwort könnte dies
sein int x=sqrt(num)
if(sqrt(num)>x){
Then its not a square root}
else{it is a perfect square}
Diese Methode funktioniert aufgrund der Tatsache, dass x ein int ist und es wird der Dezimalteil den ganzzahligen Teil nur speichern Dropdown. Wenn eine Zahl ist perfekt Quadrat einer ganzen Zahl, seine Quadratwurzel wird eine Ganzzahl sein und damit x und sqrt (x) wird gleich sein.