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...
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;
}
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 << "It's a square!\n";
Edit: sau în general:
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;
}
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
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;
}
}
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.
Am putea folosi funcția truc din dotare -
#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));
}