class Solution
{
public:
bool isPowerOfThree (int n)
{
double temp = log10 (n) / log10 (3);
return !(temp - (int) temp);
}
};
在leetcode问题326中:三的幂 给定一个整数,编写一个函数以确定它是否为三的幂。
我不明白它如何返回布尔结果。
我希望有人可以告诉我如何理解以下代码:return ! (temp - (int) temp);
答案 0 :(得分:1)
temp
是double
,(int)temp
将其截断为int
。假设temp为1.5
,temp - (int)temp
为0.5
。由于返回类型为bool
,该函数会将结果0.5
转换为bool
的{{1}} !(0.5)
。
来自@Nautatava的单词“除false
,!(0)
和!(false)
以外的所有单词都为假。因此!(null)
为!(anything other than 0)
。”
答案 1 :(得分:1)
该解决方案依赖于temp
是一个整数,当n
是3
的幂时,而temp
是一个具有小数的数字,而n
不是3
的幂。
假设n
是9
。
然后,temp
将是2.0
。
然后,(temp-(int)temp)
将为0
,!(temp-(int)temp)
将为true
。
假设n
是10
。
然后,temp
将是2.0959
。
然后,(temp-(int)temp)
将为0.0959
,!(temp-(int)temp)
将为false
。
不幸的是,浮点计算不是那么精确。最好使用:
double temp = log10 (n) / log10 (3);
double diff = (temp - (int) temp);`
return (std::abs(diff) < tolerance);
其中tolerance
可以是一个很小的数字,例如1.0E-6
。
我在计算机和ideone.com上使用cygwin / g ++进行的实验表明,对于大量数字,公差可以为1.0e-6
,但对于INT_MAX,公差必须几乎为1.0e-11
或更小。参见https://ideone.com/BgnQxV。
答案 2 :(得分:0)
此代码仅使用整数截断来测试数字Setup scripts can use pytest-runner to add setup.py test support for pytest runner.
是否为整数。如果是,则temp
将为零。由于那将意味着该数字是三的幂,因此一元的“非”运算符temp - (int)temp
将返回true。当然,在任何非零(true)值上使用的!
都是false。