它如何返回布尔结果?

how it return the boolean result?

本文关键字:布尔 结果 返回 何返回      更新时间:2023-10-16

class Solution
{
public:
bool isPowerOfThree (int n)
{
double temp = log10 (n) / log10 (3);
return !(temp - (int) temp);
}
};

在leetcode问题326:三的幂 给定一个整数,编写一个函数来确定它是否是 3 的幂。

我不明白它是如何返回布尔结果的。

我希望有人可以告诉我如何理解以下代码:return ! (temp - (int) temp);

temp是一个double(int)temp将其截断为int。假设温度是1.5temp - (int)temp0.5。由于返回类型为bool函数会将生成的0.5强制转换为应falsebool!(0.5)

@Nautatava的话"除了!(0)!(false)!(null)之外,一切都是假的。因此!(anything other than 0)false

n3的幂时,temp是一个整数,当n不是3的幂时,temp是一个具有一些分数值的数字。

假设n9.
然后,temp将被2.0.
然后,(temp-(int)temp)将被0!(temp-(int)temp)将被true.

假设n10.
然后,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。

此代码只是使用整数截断来测试数字temp是否为整数。 如果是,则temp - (int)temp将为零。 由于这意味着该数字是 3 的幂,因此一元运算符!将返回 true。 当然,!用于任何非零(真(值都是假的。