我确定这是一个非常简单的解决方案,我很抱歉,但这让我很生气。
我试图迭代一个数组并找到一个真正的整数平方根,如果没有那个,那么改为对数字进行平方。
我不知道怎样做Math.sqrt()并产生一个整数而不是一个浮点数,而不会使所有结果都是整数。有人可以帮忙吗?
def square_or_square_root(arr)
new_arr = []
arr.each { |num|
if (Math.sqrt(num)).is_a? Integer
new_arr << Math.sqrt(num)
else
new_arr << (num * num)
end
}
puts new_arr
end
答案 0 :(得分:2)
这里存在一些结构性问题以及一些数学问题。首先定义一个识别正方形的方法:
class Integer
def square?
Math.sqrt(self).to_i ** 2 == self
end
end
然后将其应用于问题。使用map
可以避免new_arr
混乱,您可以直接转换此数组:
def square_or_square_root(arr)
arr.map do |num|
if (num.square?)
num
else
num ** 2
end
end
end
然后当你使用它时,你会得到这样的结果:
square_or_square_root([ 1, 2, 3, 4, 5, 6, 7, 8 ])
# => [1, 4, 9, 4, 25, 36, 49, 64]
答案 1 :(得分:1)
#sqrt
将始终返回Float
- 但该浮点数是否具有整数值?这是个问题。
考虑一个Float
是否代表整数值的测试。
答案 2 :(得分:1)
以下代码将提供所需的输出。在这里,我们要检查数字s
的平方根是否为整数,如果是,那么它与s.floor
的差异将为0
:
def square_or_square_root(arr)
new_arr = []
arr.each { |num|
s = Math.sqrt(num)
if (s - s.floor).zero?
new_arr << s.to_i
else
new_arr << num * num
end
}
puts new_arr
end
arr = [1,2,4,5]
square_or_square_root(arr)
#1
#4
#2
#25
你或许应该在这里使用地图
arr.map { |n|
s = Math.sqrt(n)
(s - s.floor).zero? ? s.to_i : n.abs2
}
#=> [1, 4, 2 25]
注意:仅仅为了变化,我在这里使用Numeric#abs2
来找到正方形。您也可以使用Integer#**
,即n ** 2
。
答案 3 :(得分:0)
试试这个
def square_or_square_root(arr)
new_arr = []
arr.each do |num|
if (Math.sqrt(num) % 1) == 0
new_arr << Math.sqrt(num).to_i
else
new_arr << (num * num)
end
end
puts new_arr
end
答案 4 :(得分:0)
你可以这样做:
> (1..20).map {|e| (Math.sqrt(e).floor ** 2 == e) ? e.to_s : e*e }
=> ["1", 4, 9, "4", 25, 36, 49, 64, "9", 100, 121, 144, 169, 196, 225, "16", 289, 324, 361, 400]
我添加了.to_s
,以便您了解哪e
符合(Math.sqrt(e).floor ** 2 == e)
这里的关键元素是Float#floor,它返回小于或等于float的最大整数。您可以使用.to_i