如何在Ruby中检查完全平方数?我的代码为何无法运行?
你的Ruby完全平方数判断代码问题解析
嘿,我来帮你排查这段代码跑不起来的原因,还有逻辑上的问题哦~
首先看你写的代码:
def is_square(x) return true if math.sqrt(x).is_a? Integer end
这里有几个关键问题:
模块名大小写错误:Ruby里的数学工具模块是大写的
Math,不是小写的math。小写的math在Ruby里会被当成未定义的变量,直接抛出NameError,这是代码无法运行的直接原因。返回值类型判断逻辑错误:哪怕是完全平方数,
Math.sqrt(x)返回的也是Float类型(比如Math.sqrt(4)得到的是2.0,不是Integer类型的2),所以用.is_a? Integer永远会返回false,根本做不了正确判断。方法返回值不完整:如果输入的不是完全平方数,你的方法没有指定返回值,Ruby会默认返回
nil,这不符合我们需要的布尔值返回预期。
修正后的代码示例
这里给你两种靠谱的实现方式:
方式一:用浮点判断(适合普通场景)
def is_square(x) return false if x < 0 # 负数没有实数平方根,直接返回false sqrt_result = Math.sqrt(x) sqrt_result.floor == sqrt_result # 判断平方根是否是整数 end
方式二:用整数运算避免浮点精度问题(推荐,尤其处理大数时)
Ruby 2.5及以上版本支持Integer.sqrt方法,它会返回不大于目标数平方根的最大整数,我们可以用它来做更精准的判断:
def is_square(x) return false if x < 0 root = Integer.sqrt(x) root * root == x end
这样修改后,不管是正数、0还是负数,都能正确返回布尔值啦~
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

