为什么本代码无法找到权力? (红宝石)

时间:2014-12-15 15:50:20

标签: ruby math exponentiation

App Academy的练习测试表明,他们选择的方法是查找输入是否为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

我无法弄清楚为什么这不起作用,除非计数器不起作用。

2 个答案:

答案 0 :(得分:1)

您的代码存在许多问题。

  1. 首先,没有循环,如果您打算在循环中使用该方法,则每次都会重置为零,因为counter = 0

  2. counter = 0; go = 2 ** counter基本上代表go = 2 ** 0 1。因此,num % 1始终为0

  3. 您实际上需要划分数字并在此过程中更改它。 12 % 4将返回0,但如果12是2的幂,则您不知道。

  4. IO#gets返回一个字符串并将分隔符作为参数,因此您需要使用num = gets.to_i来实际获取变量num中的数字。您将num作为参数提供给gets,这不符合您的要求。

  5. 尝试:

    # 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
    

答案 1 :(得分:0)

我为你的代码添加了一些检查。注意,gets(num)返回一个String。你的代码很好,但不适用于Ruby。 Ruby讨厌像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