【问题标题】:How to get the rightmost digit from an Integer - Ruby如何从整数中获取最右边的数字 - Ruby
【发布时间】:2014-11-26 05:10:04
【问题描述】:

我正在开发一个程序,该程序需要我读入并验证一个数字,但在此过程中,我需要取一个两位整数(例如,我们会说 18)并将其相加 1 + 8。现在我它是否可以在我进行条件检查是否大于 10 并减去时起作用,但在我看来这是一个丑陋的解决方案,想知道是否有更清洁的方法?

【问题讨论】:

  • 您是说要读取一个数字的字符串表示形式并计算该数字最后两位数字的总和吗?如果有,是否保证号码至少有两位数?

标签: ruby integer digit


【解决方案1】:

您可以使用modulo operator n % 10 来获取最右边的数字。例如:

18 % 10
# => 8 
9 % 10
# => 9 
0 % 10
# => 0
(-123).abs % 10
# => 3 

要处理负数,请使用Integer#abs

编辑

Ruby 2.4 有一个Integer#digits 方法。它会从单位的位置开始将数字作为数组提供给您。如果要添加数字,可以使用Enumerable#sum

123.digits
# =>[3, 2, 1]

123.digits.first
# => 3

123.digits.sum
# => 6 

【讨论】:

    【解决方案2】:

    要添加数字中的所有数字,您可以使用以下命令:

    18.to_s.chars.map(&:to_i).reduce(:+)
    

    它将数字转换为字符串,将其拆分为数字,将每个数字转换为整数并将它们加在一起。

    适用于任意长度的数字。

    【讨论】:

    • 您可能想使用.chars 而不是.split('')
    【解决方案3】:

    我会这样做:

    any_number = 1234
    
    # Ensure your input is at most a two digit number (might not be needed)
    two_digit_number = any_number % 100                    #=> 34
    
    # Calculate the final addition
    total = two_digit_number / 10 + two_digit_number % 10  #=> 7
    

    【讨论】:

      【解决方案4】:

      对于两位整数,我们至少可以使用另一种方法:Numeric#divmod,它返回数组中的商和模数。以下是总结数字的不同方法的速度:

      b = 18
      n = 1_000_000
      Benchmark.bmbm do |x|
        x.report('to_s:') { n.times { b.to_s.chars.map(&:to_i).reduce(:+) }}
        x.report('divmod:') { n.times { b.divmod(10).reduce(:+) }}
        x.report('direct division:') { n.times { b/10 + b%10 } }
        x.report('digits:') { n.times { a.digits.reduce(:+) } }
      end
      
      #####
                             user     system      total        real
      to_s:              0.750000   0.000000   0.750000 (  0.750700)
      divmod:            0.150000   0.000000   0.150000 (  0.153516)
      direct division:   0.080000   0.000000   0.080000 (  0.076697)
      digits:            0.560000   0.020000   0.580000 (  0.574687)
      

      【讨论】:

      • 我用ruby-2.6.0 运行了这个基准测试,我得到了非常不同的结果,至少对于digits 方法是这样。还有为什么数字方法中使用的变量是a 而不是b 与其他所有方法一起使用?
      【解决方案5】:

      这里有一个有趣的解决方案:

      def get_digits(n)
      
        res=[]; i=0;
      
        while 10**i < n
          res.push( n/10**i%10 )
          i += 1
        end
      
        return res
      
      end
      

      【讨论】:

        【解决方案6】:
        def  digits_sum(number,n)
          number_array=number.to_s.chars  
          n=[n,number_array.length].min
          number_array.slice(-n,n).map {|c| c.to_i }.reduce(:+) || 0
        end
        

        此方法返回 N 个右位数字的总和。

        digits_sum 123456789,5 => 35
        digits_sum 123456789,2 => 17
        

        如果您给 N 大于数字长度,这将起作用,但如果提供负数,则不会起作用

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-06-27
          • 1970-01-01
          • 2020-12-28
          • 1970-01-01
          • 2020-02-04
          • 2011-04-22
          • 1970-01-01
          相关资源
          最近更新 更多