完美的方形和完美的立方体

时间:2009-10-11 05:35:59

标签: c++ algorithm math integer integer-arithmetic

在c ++中是否有任何预定义的函数来检查数字是否为任何数字的平方并且对于多维数据集是否相同..

9 个答案:

答案 0 :(得分:13)

不,但写一个很容易:

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

答案 1 :(得分:6)

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

答案 2 :(得分:1)

试试这个:

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

答案 3 :(得分:1)

不,没有标准的c或c ++函数来检查整数是完美的正方形还是完美的立方体。

如果您希望它快速并避免使用大多数答案中提到的float / double例程,那么只使用整数编写二进制搜索。如果你能找到一个n ^ 2&lt; m&lt; (n + 1)^ 2,则m不是完美的正方形。如果m是一个完美的正方形,那么你会找到一个n ^ 2 = m的n。问题讨论了here

答案 4 :(得分:0)

为了识别正方形我在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;
 }  

为了更快地识别正方形,我们可以使用另一种现象,正方形的数字的递归总和总是1,4,7或9。 所以更快的代码可以......

  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;


     }

  }

答案 5 :(得分:0)

对于完美的方形,您也可以这样做:

if(sqrt(n)==floor(sqrt(n)))
    return true;
else
    return false;

对于完美的立方体,你可以:

if(cbrt(n)==floor(cbrt(n)))
    return true;
else
    return false;

希望这有帮助。

答案 6 :(得分:0)

我们可以使用内置https://blog.nuget.org/20170815/Whats-nu-in-NuGet-with-VS2017-15-3.html函数 -

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

答案 7 :(得分:0)

最有效的答案可能是这样

    int x=sqrt(num)
    if(sqrt(num)>x){
    Then its not a square root}
    else{it is a perfect square}

此方法之所以有效,是因为x是一个int值,它将降低小数部分以仅存储整数部分。如果数字是整数的完美平方,则其平方根将是整数,因此x和sqrt(x)相等。

答案 8 :(得分:-2)

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

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