1

演算記号 ( ) を使用せずに数値 (整数または小数/浮動小数点数) を 2 乗する方法を記述する方法があるかどうか疑問に思っていました*。例: の 2乗はに2なります。42.56.253.512.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)浮動小数点演算は 2 つあるのに対し、浮動小数点演算k * kは 1 つしかないため、浮動小数点エラーが追加されます。

累乗

または、これはRubyなので、浮動小数点演算とまったく同じ値が必要で、乗算演算子を使用したくない場合は、べき乗演算子を使用できますk**2 == k * k

Web サービスを呼び出す

自分でやらないと増えない!

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 に答える