为什么不此代码可以找到的权力? (红宝石)(Why Can't This Code Fi

2019-10-21 09:59发布

应用学院的实践的检验,说他们所选择的发现如果输入是2的幂的方法是通过2上的环路不断分裂,并检查最后的结果是1还是0(已测试了数字1和0作为输入后),这是有道理的,但为什么不会这样工作?

def try
  gets(num)
  counter = 0
  go = 2 ** counter

  if num % go == 0 
    return true
  else
    counter = counter + 1
  end

    return false
end

我想不通,为什么这是不行的,除非计数器不能正常工作。

Answer 1:

有许多与你的代码的问题。

  1. 首先,没有环路,如果你打算使用一个循环的方法,因为你的计数器将每次重置为零counter = 0

  2. counter = 0; go = 2 ** counter counter = 0; go = 2 ** counter基本上意味着go = 2 ** 01 。 因此num % 1永远是0

  3. 实际上,你需要划分的数量和改变的过程中。 12 % 4将返回0 ,但你不知道,如果12是2的幂。

  4. IO#获取返回一个字符串,并采取了分离器作为参数,所以你需要使用num = gets.to_i在变量num实际得到的数字。 你给numgets作为参数,这不你想要什么。

尝试:

# Check if num is a power of 2
#
# @param num [Integer] number to check
# @return [Boolean] true if power of 2, false otherwise
def power_of_2(num)
  while num > 1 # runs as long as num is larger than 1
    return false if (num % 2) == 1 # if number is odd it's not a power of 2
    num /= 2 # divides num by 2 on each run
  end
  true # if num reached 1 without returning false, it's a power of 2
end


Answer 2:

我添加一些检查你的代码。 请注意, gets(num)返回一个字符串。 您的代码是好的,但不是红宝石。 红宝石讨厌型交叉变换如Perl一样。

def try(num = 0)
  # here we assure that num is number
  unless (num.is_a?(Integer)) 
    puts "oh!"
    return false
  end

  counter = 0
  go = 2 ** counter

  if num % go == 0 
    return true
  else
    counter = counter + 1
  end
    return false
end

普遍的问题是“如何进行字符串可以用‘%’运营商号码?”

尝试在解释器(一些代码irb ):

"5" % 2

要么

"5" % 0


文章来源: Why Can't This Code Find Powers? (Ruby)