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

Posted

技术标签:

【中文标题】如何在不使用乘法的情况下对数字进行平方?【英文标题】:How do I square a number without using multiplication? 【发布时间】:2014-01-23 11:20:54 【问题描述】:

想知道是否有一种方法可以在不使用操作符号 (*) 的情况下编写对数字(整数或小数/浮点数)进行平方的方法。例如:2 的平方将是42.5 的平方将是6.253.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]

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

【问题讨论】:

2.55.0.. 这是正确的吗?怎么样? 我的错,是 6.25。感谢您的关注:) 【参考方案1】:

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

对数

观察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

【讨论】:

@John - 除法必须是:k/(1.0/k) == k^2,因为k/(1/k) == k^2 中的1/k 将输出整数而不是十进制值。 @CarySwoveland - 我试过 Math.exp(Math.log(5.2) + Math.log(5.2)) #=> 27.04 其中 5.2*5.2 = 27.040000000000003 如果我们认为 3 个小数点是准确的,这几乎是相等的。你不觉得吗? @CarySwoveland:啊,是的,我只是想暗示我使用的具体示例给出了数学上精确的值——并不是每个值都是如此。【参考方案2】:

没有使用任何操作标志。

def square(num)
  num.send 42.chr, num
end

【讨论】:

【参考方案3】:

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

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

【讨论】:

这不等同于浮点乘法。您进行了两次除法并累积了 2 个错误(1/nn/(1/n))而不是 1 个错误(n * n)。如果你定义def s(n); n / (1.0 / n);,你会得到s(5.1) == 26.009...9945.1**2 == 26.009...998,它们不是相等的值。 @JohnFeminella 有效点,但是 OP 没有将此指定为要求 当然,但如果不需要“确切答案”,那么 any 答案是正确的,甚至是错误的。那么这只是一个错误是可以接受的问题。 :) @JohnFeminella 说的很对,而且说得很好。尽管使用浮点算术,您最终不会得到“精确答案”,对吗? :) 然后问题会回到为什么 OP 首先要避免使用 * 运算符。 正如@JohnFeminella 提到的。当我尝试使用 (1/n, n/(1/n)) 时,它引发了 ZeroDivisionError。所以,它必须(1.0/n, n/(1.0/n)) 所以,它需要十进制数而不是整数。不错的收获。 :)

以上是关于如何在不使用乘法的情况下对数字进行平方?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用内置函数的情况下计算数字的平方根? [重复]

如何在不使用 Spark SQL 的情况下对 Spark 中的数据帧进行排序?

在不知道它们的值的情况下对 Python 数字列表进行排序,而只知道它们之间的关系

如何在不使用 GROUP BY 子句的情况下对行进行分组

如何在不使用任何内置高斯函数的情况下对图像进行高斯模糊?

如何在不使用 TestFlight 的情况下对 iOS 应用进行 beta 测试