如何在不使用乘法的情况下对数字进行平方?

Sur*_*rya 1 ruby algorithm numbers perfect-square

想知道是否有办法编写一个方法,在不使用操作符号(*)的情况下对数字(整数或小数/浮点数)进行平方.例如:方形24,平方2.5将是6.25,和3.5的将是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]
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*lla 9

你可以使用一些技巧,按照增加的技巧排列在这里.

对数

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

Math.exp(Math.log(5.2) + Math.log(5.2))
# => 27.04
Run Code Online (Sandbox Code Playgroud)

这里没有乘法!

正如另一位评论者所说,你可以采取相互操作,分裂:k/(1.0/k) == k^2.但是,这会引入额外的浮点错误,因为它k / (1.0 / k)是两个浮点运算,而k * k只有一个浮点运算.

或者,因为这是Ruby,如果你想要与浮点运算完全相同的值,并且你不想使用乘法运算符,你可以使用指数运算符:k**2 == k * k.

调用Web服务

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

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

公然作弊

最后,如果你感觉非常便宜,你可以避免实际使用文字"*"操作,并使用等效的东西:

n = ...
require 'base64'
n.send (Base64.decode64 'Kg==').to_sym, n    # => n * n
Run Code Online (Sandbox Code Playgroud)