它如何返回布尔结果?
how it return the boolean result?
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.5
,temp - (int)temp
是0.5
。由于返回类型为bool
函数会将生成的0.5
强制转换为应false
的bool
!(0.5)
。
@Nautatava的话"除了!(0)
、!(false)
和!(null)
之外,一切都是假的。因此!(anything other than 0)
false
。
当n
是3
的幂时,temp
是一个整数,当n
不是3
的幂时,temp
是一个具有一些分数值的数字。
假设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。
此代码只是使用整数截断来测试数字temp
是否为整数。 如果是,则temp - (int)temp
将为零。 由于这意味着该数字是 3 的幂,因此一元运算符!
将返回 true。 当然,!
用于任何非零(真(值都是假的。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 一个关于在C++中重载布尔运算符的问题
- 提升精神:解析布尔表达式并简化为规范范式
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 它如何返回布尔结果?
- 为什么 SFINAE 没有给出增加布尔值的正确结果?
- 布尔函数`again()`得到相同的结果
- 按位运算结果和布尔值
- C++内存:删除未使用的布尔数组可以将结果从正确更改为错误
- c++ std:: string.Find以布尔表达式返回意外结果
- 如何从布尔结果得到全一或全零
- C++:将按位 AND 的结果分配给布尔值
- 链接布尔值会给出与预期相反的结果