C++中是否有预定义的函数用于检查一个数是否是某个数的平方或立方。
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)
, 通常可以写成 pow(x, 1./2)
或者 pow(x, 1./3)
例如:
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";
编辑:或者通用的:
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;
}
pow(x, 1./3)
的问题在于,1/3 在浮点数中没有精确的表示方法,因此你并不是“真正”获得了立方根。 C99 及以后版本拥有 cbrt
函数,应该能更好地获取立方根。 - C. K. Youngpow
更容易推广,并且很容易纠正浮点误差。 - Jesse Beder试试这个:
#include<math.h>
int isperfect(long n)
{
double xp=sqrt((double)n);
if(n==(xp*xp))
return 1;
else
return 0;
}
int x=sqrt(num)
if(sqrt(num)>x){
Then its not a square root}
else{it is a perfect square}
这种方法有效是因为x是一个整数,它会舍去小数部分,只存储整数部分。如果一个数字是一个整数的完全平方数,它的平方根将是一个整数,因此x和sqrt(x)将相等。
为了识别平方数,我在Java中尝试了这个算法。只需稍微改变语法,您也可以在C++中实现它。 逻辑是,每两个连续的完全平方数之间的差值增加2。Diff(1,4)=3,Diff(4,9)=5,Diff(9,16)=7,Diff(16,25)=9......以此类推。 我们可以利用这种现象来识别完全平方数。 Java代码如下:
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;
}
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;
}
}
我们可以使用内置的truc函数 -
#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));
}
对于完全平方数,你也可以这样做:
if(sqrt(n)==floor(sqrt(n)))
return true;
else
return false;
对于完全立方数,您可以:
if(cbrt(n)==floor(cbrt(n)))
return true;
else
return false;
return sqrt(n)==floor(sqrt(n))
?(为什么更喜欢floor
而不是round
?)然后,有int r = round(cbrt(n)); return n == r*r*r
- 这些都不是“预定义的”,留给我们2016年的知识:Chris' answer。 - greybeardbool isSquare(int n) {
return floor(sqrt(n)) == ceil(sqrt(n));
}
bool isQube(int n) {
return floor(cbrt(n)) == ceil(cbrt(n));
}
sqrt()
或cbrt()
恰好返回比实际根小 epsilon ,那么将其转换为整数将会截断该值,检查会失败。要完全防范这种情况,您还需要检查平方根情况下的n ==(root +1)*(root +1)
或者立方根情况下的n ==(root +1)*(root +1)*(root +1)
。 - Adam Rosenfieldabs(root-round(root)) <= epsilon
难道不比乘法更快吗? - mpen