【问题标题】:How can I check for a perfect square in Ruby?如何在 Ruby 中检查一个完美的正方形?
【发布时间】:2018-05-28 13:03:07
【问题描述】:

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

这是我的代码:

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

知道为什么它不起作用吗?

【问题讨论】:

  • Math 应该大写,例如 return true if Math.sqrt(x).is_a?(Integer) 。此外,方法的名称最好是is_square?(x)
  • 谢谢。我刚刚这样做了,但它仍然返回以下错误消息:# main.rb:4:in is_square' main.rb:11:in block (2 levels) in ' /runner/frameworks/ruby/cw-2.rb:180:in @987654327 @it' /runner/frameworks/ruby/cw-2.rb:206:in it' main.rb:10:in block in ' /runner/frameworks/ruby/cw-2.rb:55:in block in describe' /runner/frameworks/ruby/cw-2.rb:46:in measure' /runner/frameworks /ruby/cw-2.rb:51:in describe' /runner/frameworks/ruby/cw-2.rb:202:in describe' main.rb:9:in ` '
  • 你用什么来运行程序?
  • 它在代码战上。即使我除以 1 以避免浮动,它仍然充满错误......别担心,你的回答仍然非常有用,帮助我了解更多关于编码的知识!

标签: ruby


【解决方案1】:
  1. 您拼错了Math,这是专为数学运算设计的常量保持模块。
  2. Math.sqrt(9) 也返回浮点数,所以这也行不通。但是您可以通过1 检查除法的余数。
  3. 除此之外,你写这个方法的风格真的很糟糕,它可以写得更好。

总而言之,我会这样做:

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

【讨论】:

  • 谢谢。我最近才开始学习,因此出现了样式错误。
  • Pickaxe Book 的原始版本可在for free 获得,它很好地介绍了 Ruby 语言及其样式约定。
【解决方案2】:

结果是一个浮点数:

Math.sqrt(4)
# => 2.0

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

您需要检查结果是否为不带小数点的数字:

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

【讨论】:

    【解决方案3】:

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

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

    检查浮点数是否为整数的最简单方法是将其除以 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
    

    【讨论】:

    • 谢谢!这是一个非常详细的解释:)
    【解决方案4】:

    Math#sqrt 的结果永远不会是整数类型,即使是完全平方也是如此。一般来说,类型检查在 Ruby 中不是很有帮助。

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

    与强制值比较:

    x == x.to_int
    

    检查分母是否为1:

    x.denominator == 1
    

    检查余数模1是否为0:

    x % 1 == 0
    

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

    def perfect_square?(x)
      # Implementation
    end
    

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 2022-08-23
        • 2015-11-06
        • 2016-07-03
        • 2015-07-02
        • 2016-03-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多