通过它们的可分性比较两个整数

时间:2014-09-15 02:51:19

标签: ruby

例如:

8 > 10 = true,因为8可以被2整除3次而10只可以整除一次。

如何比较任何数字范围内的两个整数?模数和除法运算符是否能够完成此任务?

3 个答案:

答案 0 :(得分:4)

使用二进制计算来判断它

def devided_by_two(i)
  return i.to_s(2).match(/0*$/).to_s.count('0')
end

要将整数除数设为2,只需将其转码为二进制,并判断平均数的结尾有多少零。我认为我提供的代码可以更简单。

答案 1 :(得分:1)

是的,他们有能力。一个数字即使,当你将它除以2时,余数为零。

因此,你可以使用一个循环来连续除以2,直到你得到一个奇数,并计算你做了多少次。

(伪代码)函数,用于将" divisibility分配为2,连续"数字的值将类似于:

def howManyDivByTwo(x):
    count = 0
    while x % 2 == 0:
        count = count + 1
        x = x / 2             # make sure integer division
    return count

那不应该很难变成Ruby(或任何程序类型的语言,真的),例如:

def howManyDivByTwo(x)
  count = 0
  while x % 2 == 0
    count = count + 1
    x = x / 2
  end
  return count
end

print howManyDivByTwo(4), "\n"
print howManyDivByTwo(10), "\n"
print howManyDivByTwo(11), "\n"
print howManyDivByTwo(65536), "\n"

输出正确的:

2
1
0
16

敏锐的读者会注意到该功能中存在边缘情况,您可能不想想尝试将零传递给它。如果它是生产代码,你需要抓住它并采取智能行动,因为你可以将零除以2直到奶牛回家,而不会达到奇数。

您返回的零值取决于您未详细说明的需求。理论上(数学上),你应该返回无穷大,但我会把它留给你。

答案 2 :(得分:1)

请注意,如果重新定义这样的基本方法,您可能会弄乱大部分代码。知道了,这就是它的完成方式:

class Integer
  def <=> other
    me = self
    return 0 if me.zero? and other.zero?
    return -1 if other.zero?
    return 1 if me.zero?
    while me.even? and other.even?
      me /= 2
      other /= 2
    end
    return 0 if me.odd? and other.odd?
    return -1 if me.odd?
    return 1 if other.odd?  # This condition is redundant, but is here for symmetry.
  end
end