从数组中查找真正的整数平方根

时间:2017-07-16 19:26:27

标签: arrays ruby iteration

我确定这是一个非常简单的解决方案,我很抱歉,但这让我很生气。

我试图迭代一个数组并找到一个真正的整数平方根,如果没有那个,那么改为对数字进行平方。

我不知道怎样做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

5 个答案:

答案 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

实现相同的目标