4

((num / i) % 1 == 0)当 num 是双精度时,为什么在 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;
}
4

4 回答 4

7

%运算符仅允许用于整数类型(以及重载它的用户定义类型)。对于浮点,您需要函数 fmod.

于 2012-11-09T09:34:14.317 回答
6

实际上你想要做的是检查是否n可以被整除,i所以你需要改变的是

if ((num / i) % 1 == 0)

进入

if (num % i == 0) 

您应该知道这很容易出错,因为您将double其用作num. 您应该改用 an int

于 2012-11-09T09:32:42.897 回答
2

运算符由%C++11 §5.6/4 定义:

如果商 a/b 在结果类型中是可表示的,则 (a/b)*b + a%b 等于 a。

这对浮点类型毫无意义。模数的定义取决于除法四舍五入到整数。

正如 James Kanze 所说,请std::fmod改用。

于 2012-11-09T09:37:04.683 回答
0

此代码为您返回一个双重对象

(num / i)

模运算仅适用于 int 类型。您可以将其转换为 int 类型

( ((int) (num / i) ) % i)
于 2012-11-09T09:36:58.167 回答