R = /
\A # match beginning of string ("anchor")
10* # match 1 followed by zero or more zeroes
\z # match end of string ("anchor")
/x # free-spacing regex definition mode
def po2?(n)
(n.to_s(2) =~ R) ? true : false
end
po2?(4) #=> true
po2?(5) #=> false
再来一次
这将使用Fixnum#bit_length和Fixnum#[]:
def po2?(n)
m = n.bit_length-1
n[m] == 1 and m.times.all? { |i| n[i].zero? }
end
def power_of_two?(number)
continue = true
if number == 1
return true
end
if number % 2 != 0
return false
else
while continue == true do
if number.to_f / 2.0 == 2.0
continue = false
return true
else
if number % 2 != 0
continue = false
return false
else
number /= 2
continue = true
end
end
end
end
end
9条答案
按热度按时间z9gpfhce1#
显然,
n
是非负整数。代码
示例
说明
Fixnum#to_s提供给定基址的整数(接收方)的字符串表示形式。该方法的参数(默认值为10)是基址。例如:
我们感兴趣的是底数2。对于2的幂:
对于一些不是2的幂的自然数:
因此,我们希望匹配包含一个
1
的二进制字符串。"另一种方式"
再来一次
这将使用Fixnum#bit_length和Fixnum#[]:
“第四个,也许是最好的"
0vvn1miw2#
试试看:
here解释得很好(对于C#,但@GregHewgill的解释在这里也适用)
11dmarpk3#
我会使用Ruby的
Math
模块来执行类似的操作。或者,如果你想变得很酷:
部分IRB输出:
此方法假定输入为正整数。
来源
ax6ht2ek4#
另一个解决这个问题的方法是与这里的大多数答案相反--我们可以从数字1开始,然后找出这个数字是否是2的幂。
我们从1开始,然后将1乘以2,一直乘以2,直到乘积大于
num
(product < num
),一旦满足这个条件,我们就停止,退出循环,检查它是否等于num
(product == num
),如果是,num
就是2的幂。k4emjkb15#
正如在上面的注解中指出的,您会得到错误,因为您试图在一个不可迭代的对象(一个int)上使用
inject
方法。注意:如果数值非常大,接近二进制(如2^64 - 1),则会失败。一个简单的版本(但较慢)是:
请评论任何改进,你可能会发现任何。
fxnxkyjh6#
下面是另一个使用递归的解决方案:
gojuced77#
在我看来,最简单的--但可能有点长--方法就是这样编写这个递归方法:
1是2的幂(2^0),因此它首先检查给定的数字是否为1。如果不是,则检查它是否为奇数,因为1是唯一一个2的幂的奇数。
如果是奇数,则返回false,并转到else语句,检查除以2的数是否为2,因为如果是2的幂,则显然是2的幂,这是一个浮点数,因为Ruby中的5/2将返回2。
如果为false,则再次检查数字是否为奇数--第一轮不需要,之后需要。如果数字不是奇数,则将数字除以2,然后再循环一次。
这将持续下去,直到程序通过得到2或任何奇数来解析自己,并分别返回true或false。
moiiocjp8#
我在一个训练营应用程序准备中遇到了这个问题。我不是一个数学爱好者,不理解其中的一些方法,所以我想为像我这样的人提交一个常识性的方法。这需要很少的数学知识,除了知道一个数字的二次幂将是某个数字乘以自己的结果。
这个方法计数到从1开始的num变量,并且如果(序列中的任何一个数字乘以它自己)等于num &如果num不为0(下面将详细介绍),则返回真。
示例:数值= 9
返回true,方法运行结束。
倍方法需要大于0的整数,因此,由于#倍以“0”作为变量不做任何事情并且当在#倍迭代之外时返回假的事实,该边缘情况被“处理”。
jucafojl9#