如何遍历整数的数字?

时间:2012-10-26 17:25:17

标签: ruby integer loops

  

可能重复:
  Turning long fixed number to array Ruby

好吧,我必须在Ruby中遍历整数的数字。现在我只是把它拆分成一个数组,然后迭代它。但是我想知道是否有更快的方法来做到这一点?

6 个答案:

答案 0 :(得分:39)

最短的解决方案可能是:

1234.to_s.chars.map(&:to_i)
#=> [1, 2, 3, 4]

更正统的数学方法:

class Integer
  def digits(base: 10)
    quotient, remainder = divmod(base)
    quotient == 0 ? [remainder] : [*quotient.digits(base: base), remainder]
  end
end

0.digits #=> [0]
1234.digits #=> [1, 2, 3, 4]
0x3f.digits(base: 16) #=> [3, 15]

答案 1 :(得分:14)

你可以使用模数/除以10的旧技巧,但除非你有巨大的数字,否则它的速度不会快得多,而且会向你提供数字:

i = 12345

while i > 0 
  digit = i % 10
  i /= 10
  puts digit
end

输出:

5
4
3
2
1

答案 2 :(得分:5)

split=->(x, y=[]) {x < 10 ? y.unshift(x) : split.(x/10, y.unshift(x%10))}

split.(1000) #=> [1,0,0,0]
split.(1234) #=> [1,2,3,4]

答案 3 :(得分:4)

Ruby有divmod,它将同时计算x%10x/10

class Integer
  def split_digits
    return [0] if zero?
    res = []
    quotient = self.abs #take care of negative integers
    until quotient.zero? do
      quotient, modulus = quotient.divmod(10) #one go!
      res.unshift(modulus) #put the new value on the first place, shifting all other values
    end
    res # done
  end
end

p 135.split_digits #=>[1, 3, 5]

对于像Project Euler这样的速度非常重要的东西,这很不错。在Integer上定义它也会使它在Bignum上可用。

答案 4 :(得分:3)

我喜欢Enumerator的善良。我为我的一个项目编写了这段代码:

class Integer
  def digits
    Enumerator.new do |x|
      to_s.chars.map{|c| x << c.to_i }
    end
  end
end

这使您可以访问所有优秀的枚举器内容:

num = 1234567890

# use each to iterate over the digits
num.digits.each do |digit|
  p digit
end

# make them into an array
p num.digits.to_a     # => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]

# or take only some digits
p num.digits.take(5)  # => [1, 2, 3, 4, 5]

# you can also use next and rewind
digits = num.digits
p digits.next         # => 1
p digits.next         # => 2
p digits.next         # => 3
digits.rewind
p digits.next         # => 1

答案 5 :(得分:2)

尝试mod 10(将​​给你最后一位数字),然后除以10(将给你剩下的数字),重复这个直到你到最后一位数。当然,如果你想从左到右遍历数字,你将不得不颠倒顺序。