它如何返回布尔结果?

时间:2019-10-10 04:39:58

标签: c++ function

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

  }
};

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

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

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

3 个答案:

答案 0 :(得分:1)

tempdouble(int)temp将其截断为int。假设temp为1.5temp - (int)temp0.5。由于返回类型为bool,该函数会将结果0.5转换为bool的{​​{1}} !(0.5)

来自@Nautatava的单词“除false!(0)!(false)以外的所有单词都为假。因此!(null)!(anything other than 0)。”

答案 1 :(得分:1)

该解决方案依赖于temp是一个整数,当n3的幂时,而temp是一个具有小数的数字,而n不是3的幂。

假设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

答案 2 :(得分:0)

此代码仅使用整数截断来测试数字Setup scripts can use pytest-runner to add setup.py test support for pytest runner.是否为整数。如果是,则temp将为零。由于那将意味着该数字是三的幂,因此一元的“非”运算符temp - (int)temp将返回true。当然,在任何非零(true)值上使用的!都是false。