2

このコードを単純化するにはどうすればよいですか?

if number < 100
    divisor = 10
elsif number < 1000
    divisor = 100
elsif number < 1000000 # 1 million
    divisor = 1000
elsif number < 1000000000 # 1 billion
    divisor = 1000000
elsif number < 1000000000000 # 1 trillion
    divisor = 1000000000
# Keep goin...
end

ここでのポイントは...

  • 番号が>= 0で、< 100必要な場合はdivisor = 10.
  • 番号が>= 100で、< 1.000必要な場合はdivisor = 100.
  • 番号が>= 1.000で、< 1.000.000必要な場合はdivisor = 1.000.
  • 番号が>= 1.000.000で、< 1.000.000.000必要な場合はdivisor = 1.000.000.
  • これが永遠に続く..

whileとの組み合わせをいくつか試しましたpowが、ここではパターンがわかりません。

4

4 に答える 4

3
def divisor num
  10 ** (num < 1000 ? Math.log10(num).to_i : Math.log10(num).to_i / 3 * 3)
end

divisor(99) # => 10
divisor(999) # => 100
divisor(999_999) # => 1_000
divisor(999_999_999) # => 1_000_000
divisor(999_999_999_999) # => 1_000_000_000

または、よりコンパクトに:

def divisor num
  ->a{10 ** (a < 3 ? a : a / 3 * 3)}.call(Math.log10(num).to_i)
end
于 2013-01-24T08:24:34.893 に答える
1

試す

   divisior = 10**(number.to_s.length - 1)

与えられた条件に従って、
結果が得られます。

于 2013-01-24T06:58:12.497 に答える
0
x=number
divisor=10
(x/=10;divisor*=10) while x>=100
于 2013-01-24T08:51:37.947 に答える
0

特定のケースでは、除数を計算できます。Dnyans の回答を参照してください。

同様の問題があり、結果を計算できないが、if-elsif構造を避けたい場合は、次を使用できますcase

case number 
  when 0...100
    divisor = 10
  when 100...1000
    divisor = 100
  when 1000...1000000 # 1 million
    divisor = 1000
  when 1000000...1000000000 # 1 billion
    divisor = 1000000
  when 1000000000...1000000000000 # 1 trillion
    divisor = 1000000000
# Keep goin...
  else
end

を実装するに< 100は、もう少し複雑です。

NegativeInfinity = -1.0/0.0 
case number 
  when NegativeInfinity...100
    divisor = 10
  when 100...1000
    divisor = 100
  when 1000...1000000 # 1 million
    divisor = 1000
  when 1000000...1000000000 # 1 billion
    divisor = 1000000
  when 1000000000...1000000000000 # 1 trillion
    divisor = 1000000000
# Keep goin...
  else
end

divisor毎回割り当てるのを避けたい場合は、 case-commandの結果を使用できます。

divisor = case number 
  when NegativeInfinity...100
    10
  when 100...1000
    100
  when 1000...1000000 # 1 million
    1000
  when 1000000...1000000000 # 1 billion
    1000000
  when 1000000000...1000000000000 # 1 trillion
    1000000000
# Keep goin...
  else
end

そして、sawas の回答と組み合わせて、すべての値に対してそれを作成できます。

divisor = case number 
  when 0...100
    10
  when 100...1000
    100
  else
    (10 ** (Math.log10(number).to_i / 3 * 3))
end
于 2013-01-24T08:40:00.280 に答える