为什么num是double时((num / i) % 1 == 0)
为什么不能在C ++中工作?以及我将如何编写此代码,该代码通过检查是否有余数(例如0.3333)来检查阶乘。
int getFactorials (double num)
{
int total = 0; // if (total / 2) is equal too 'num' it is a perfect number.
for (int i = 1; i < num; i++)
{
if ((num / i) % 1 == 0)
{
cout << i << endl;
}
}
return 0;
}
实际上,您要做的是检查n
是否可被i
整除,因此您所要做的就是
if ((num / i) % 1 == 0)
进入
if (num % i == 0)
您应该知道这容易出错,因为您正在使用double
作为num
的类型。您应该改用int
。
%
运算符仅适用于整数类型(且由用户定义)使其过载的类型)。对于浮点,您需要功能fmod
。
%
运算符由C ++ 11§5.6/ 4定义:
如果结果的类型可表示商a / b,则(a / b)* b + a%b等于a。
这对于浮点类型没有意义。模数的定义取决于除法舍入为整数。
如James Kanze所说,改用std::fmod
。
此代码返回一个双重对象
std::fmod
仅对int类型允许模运算。您可以将其转换为int类型
(num / i)
( ((int) (num / i) ) % i)