如何在Ruby中检查完美的正方形?

时间:2018-05-28 13:03:08

标签: ruby

我正试图检查一个数字是否是一个完美的正方形。

这是我的代码:

def is_square(x)
  return true if
  math.sqrt(x).is_a? Integer
end

知道为什么它不起作用?

5 个答案:

答案 0 :(得分:3)

  1. 你错误地Math,这是为数学运算设计的恒定控制模块。
  2. Math.sqrt(9)也会返回浮动,所以这也不会起作用。但您可以通过1检查除法的余数。
  3. 除此之外,您编写此方法的样式非常糟糕,可以写得更好。
  4. 总结一下,我会做这样的事情:

    def is_square?(x)
      (Math.sqrt(x) % 1).zero?
    end
    

答案 1 :(得分:2)

结果是浮动:

Math.sqrt(4)
# => 2.0

Math.sqrt(4).class
#  => Float

您需要检查结果是否是没有小数点的数字:

def is_square(x)
  Math.sqrt(x) % 1 == 0
end

答案 2 :(得分:1)

首先,您需要将math大写为Math

此代码的另一个问题是Math.sqrt的返回值。假设您提供4作为x的值。 Math.sqrt 总是返回一个Float(十进制),即使Float恰好是一个整数,结果也是2.0。就Ruby而言,以及大多数编程语言,2.0不是整数。它仍然是一个Float,只是一个没有任何小数部分。

检查Float是否为整数的最简单方法是将其修改为1(即将其除以1得到余数),这可以使用%来完成,然后检查这个余数为0。

def is_square(x)
  return true if Math.sqrt(x) % 1 == 0
end

此功能仍然不完美;对于正方形,它返回true,对于非正方形,返回nil。将false替换为非正方形更有意义。

这可以通过删除if并简单地返回条件的结果来完成。此外,块的最后一个语句不需要Ruby中的return

def is_square(x)
  Math.sqrt(x) % 1 == 0
end

答案 3 :(得分:0)

<router-outlet>的结果永远不会是整数类型,即使对于完美的正方形也是如此。通常,类型检查在Ruby中不是很有用。

相反,您可以使用几种策略来确定Ruby中的数字是否为整数。

与强制值比较:

Math#sqrt

检查分母是否为1:

x == x.to_int

检查模1的余数是否为0:

x.denominator == 1

顺便说一句,惯用Ruby也不使用像x % 1 == 0 这样的前缀,而是在谓词方法中添加后缀问号:

is_

答案 4 :(得分:0)

从Ruby 2.5开始,Integer类具有sqrt,它返回整数平方根。

def is_square?(x)
  Integer.sqrt(x) ** 2  == x
end