应用学院的实践的检验,说他们所选择的发现如果输入是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
我想不通,为什么这是不行的,除非计数器不能正常工作。
有许多与你的代码的问题。
首先,没有环路,如果你打算使用一个循环的方法,因为你的计数器将每次重置为零counter = 0
。
counter = 0; go = 2 ** counter
counter = 0; go = 2 ** counter
基本上意味着go = 2 ** 0
是1
。 因此num % 1
永远是0
实际上,你需要划分的数量和改变的过程中。 12 % 4
将返回0
,但你不知道,如果12是2的幂。
IO#获取返回一个字符串,并采取了分离器作为参数,所以你需要使用num = gets.to_i
在变量num实际得到的数字。 你给num
以gets
作为参数,这不你想要什么。
尝试:
# 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
我添加一些检查你的代码。 请注意, 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