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

d3v*_*pro 8 c++ algorithm math integer integer-arithmetic

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

Chr*_*ung 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 天啊,它伤到了我的脑袋.我一直在寻找"root"函数,直到我意识到你刚刚初始化一个整数...我非常不喜欢你的编码风格. (37认同)
  • 由于浮点错误,这并不总是有效:如果`sqrt()`或`cbrt()`恰好返回epsilon小于实际根,则转换为整数将截断该值,并且检查将失败.要完全防止这种情况,你还需要检查`n ==(root + 1)*(root + 1)`是否为平方根情况,或者如果`n ==(root + 1)*(root) + 1)*(root + 1)`用于多维数据集根情况. (4认同)
  • @Mark:你可能不喜欢它,但它是C++中"更标准"的初始化风格; 我认为它被称为"构造函数语法"或类似的东西.也就是说,如果你正在构造一个对象,比如说,需要多个构造函数参数,那么无论如何都必须使用该语法.我不喜欢为数字类型做一个特殊的例外,所以我也使用构造函数语法. (4认同)
  • 哦,上帝,我刚回到这个问题,并试图留下相同的评论,然后注意到其他人已经做了,然后尝试upvote他们但找不到向上箭头,然后看着用户,并意识到这是我.检查`abs(root-round(root))<= epsilon`而不是乘法会不会更快? (4认同)
  • 这称为直接初始化。但是大括号初始化比使用括号更受欢迎,因为它消除了大多数令人烦恼的解析问题。 (2认同)

Jes*_*der 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";
Run Code Online (Sandbox Code Playgroud)

编辑:或一般情况下:

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 使用`pow(x,1./3)`的问题是1/3在浮点中没有精确的表示,所以你不是"真的"得到立方根.C99以后有`cbrt`,这应该可以更好地获得立方根. (2认同)