Swift 斯威夫特三人不能通过243
我的项目任务是找出一个整数是否是三的幂。我的代码可以通过0、1、3、9、27、81个测试用例,但不能通过243个。 当我试图打印出来调试时,我发现了一件奇怪的事情。当我输入243时,我打印出log3(243),它给出了5.0,这是正确的。但是我试着打印log3(243)%1,它给了我0.999999999,这太奇怪了Swift 斯威夫特三人不能通过243,swift,math,Swift,Math,我的项目任务是找出一个整数是否是三的幂。我的代码可以通过0、1、3、9、27、81个测试用例,但不能通过243个。 当我试图打印出来调试时,我发现了一件奇怪的事情。当我输入243时,我打印出log3(243),它给出了5.0,这是正确的。但是我试着打印log3(243)%1,它给了我0.999999999,这太奇怪了 class Solution { func isPowerOfThree(n: Int) -> Bool { //print("log3(n): \(log3(Dou
class Solution {
func isPowerOfThree(n: Int) -> Bool
{
//print("log3(n): \(log3(Double(n)))")
if n == 0
{
return true
}
if n == 1
{
return true
}
//print("weird here: \(log3(Double(n)) % 1)" )
if log3(Double(n)) % 1 == 0.0
{
return true
}
//print("log3: \(log3(Double(n)))")
//print("floor log3: \(floor(log3(Double(n))))")
//print("log3: \(Int(log3(Double(n))))")
return false
}
func log3(val: Double) -> Double
{
return log(val)/log(3.0)
}
}
var test = Solution()
var result = test.isPowerOfThree(243)
print(result)
这是由于双精度。以二进制格式编码的数字,在某些情况下,精度无法达到预期 我试过你的程序和log3(243)给我4.999999。。。 所以模1失效是有意义的 如果将Double更改为Float,程序将正常工作
if log3(Float(n)) % 1 == 0.0
func log3(val: Float) -> Float
不过,一般来说,要检查int是否是3的幂,不应该将其更改为float或double。您应该将其保留为int。
log()
需要一个Float
或Double
,因此他无论如何都必须转换int
。但我同意,投得越少越好。你们说得对!我只是想知道。我将分享我的解决方案。非常感谢你!我预计,在精度极限下,对Float
进行强制转换将导致问题。从Int
进行铸造会导致精度损失,因此应避免。特别是如果有一个非强制转换版本(while(n%3==0)n/=3;返回n==1;
,或者只是预先计算适合Int
的20个3的幂)。如果必须强制转换,请至少使用一个对浮点运算更健壮的版本:pow(3,round(log3(Double(n)))==n
。有关详细信息,请参阅