2013-01-24 80 views
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
  • 这永远保持布莱恩..

我试过的whilepow几个组合,但我没有在这里得到的格局。

+0

看起来你有两种模式在这里。考虑一下你用来决定这些值的逻辑,它可能会导致答案(或者它不是你的代码?) –

+0

您是否尝试过使用'for-loop'和'modulus'运算符? –

+0

elsif number <1000000#1 million divisor = 1000您需要1000或100000 –

回答

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 
1

尝试

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

按给定的条件
它会给你造成。

+0

试着用10 ** 6-1刚刚编辑答案 –

+0

用'number = 28456'我们得到了'10 ** 5-1' == * 10000 *而不是* 1000 * –

+0

我已经更新了这个问题与更多信息 –

0

在特定情况下,可以计算除数。见Dnyans answer

如果你有类似的问题,你不能计算出结果,但希望避免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有点more complex

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 answer结合你可以把它所有的值:

divisor = case number 
    when 0...100 
    10 
    when 100...1000 
    100 
    else 
    (10 ** (Math.log10(number).to_i/3 * 3)) 
end 
0
x=number 
divisor=10 
(x/=10;divisor*=10) while x>=100