1

想知道是否有一种方法可以在不使用操作符号 ( *) 的情况下编写对数字(整数或小数/浮点数)进行平方的方法。例如:square of 2will be 4, square of 2.5will be6.253.5's will be 12.25

这是我的方法:

def square(num)
  number = num
  number2 = number
  (1...(number2.floor)).each{ num += number }
  num
end

puts square(2) #=> 4 [Correct]
puts square(16) #=> 256 [Correct]
puts square(2.5) #=> 5.0 [Wrong]
puts square(3.5) #=> 10.5 [Wrong]

该代码适用于整数,但不适用于浮点数/小数。我在这里做错了什么?另外,如果有人对这个问题有新的方法,请分享。算法也很受欢迎。此外,考虑到该方法的性能将是一个加分项。

4

3 回答 3

10

您可以使用一些技巧,这里按照技巧增加的顺序排列。

对数

观察k * k = e^log(k*k) = e^(log(k) + log(k)),并使用该规则:

Math.exp(Math.log(5.2) + Math.log(5.2))
# => 27.04

这里没有乘法!

分配

正如另一位评论者所建议的那样,您可以采取互惠运算,除法:k/(1.0/k) == k^2. 但是,这会引入额外的浮点错误,因为k / (1.0 / k)是两个浮点运算,而k * k只有一个。

求幂

或者,由于这是 Ruby,如果您想要与浮点运算完全相同的值并且不想使用乘法运算符,则可以使用幂运算符:k**2 == k * k

调用网络服务

如果你不自己做,它不会成倍增加!

require 'wolfram'       # https://github.com/cldwalker/wolfram
query  = 'Square[5.2]'
result = Wolfram.fetch(query)

公然作弊

最后,如果你觉得真的很便宜,你可以避免实际使用文字“*”操作,并使用等效的东西:

n = ...
require 'base64'
n.send (Base64.decode64 'Kg==').to_sym, n    # => n * n
于 2014-01-06T05:46:18.857 回答
4

没有使用任何操作标志。

def square(num)
  num.send 42.chr, num
end
于 2014-01-06T05:46:52.700 回答
3

嗯,乘法的逆是除法,所以你可以通过除以它的逆来得到相同的结果*。即:square(n) = n / (1.0 / n)。只要确保您不会无意中进行整数除法即可。

*技术上的两次除法会在浮点运算中引入第二次舍入误差的机会,因为它执行两次运算。因此,这不会产生与浮点乘法完全相同的结果——但这也不是问题的要求。

于 2014-01-06T05:29:41.540 回答