受this帖的启发,我想概括一下这个问题。 检查给定的数字m是否是数字n的整数幂。
Here is我的第一次尝试,而且当我测试它时,一切都很好。
然后我试图通过对链接上的帖子的回复来写一些不同的东西。
主要思想是检查一个数字在另一个数字的对数是否为整数。出于这个原因,我使用自然对数知道,
log a b / log a c = log c b < / SUP>
(我的红宝石版本是1.8.7)
def m_is_power_of_n(m,n)
#false by definiton
f1 = (n==0 and m!=0)
f2 = (n==1 and m!=1)
#true by definition
t1 = m==n
t2 = m==1
if f1 or f2
return false
elsif t1 or t2
return true
else
a = Math.log(m)/Math.log(n)
return a.to_i == a #updated after steenslag's comment
#if a.to_i == a
# return true
#else
# return false
#end
end
end
我不知道自己做错了什么,因为当我传递参数(36,6),(125,5)时,它会像我预期的那样返回true
。但是对于(216,6)或(25,5),它返回false
。
P.S。顺便说一句,我是一个红宝石新手,欢迎所有关于编码风格的批评:)
答案 0 :(得分:3)
您有精确度问题,因为您可以看到使用irb
irb(main):001:0> Math.log(216)
=> 5.375278407684165
irb(main):002:0> Math.log(6)
=> 1.791759469228055
irb(main):003:0> Math.log(216)/Math.log(6)
=> 3.0000000000000004
不幸的是,3.0000000000000004不等于3。
您可以对结果进行舍入...
a = (Math.log(m)/Math.log(n)).round(14)