用双重C ++测试可分性

时间:2012-11-09 09:29:36

标签: c++ double factorial arithmetic-expressions

当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;
}

4 个答案:

答案 0 :(得分:7)

%运算符仅允许用于整数类型(和用户定义的) 超载它的类型)。对于浮点,您需要该功能 fmod

答案 1 :(得分:5)

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

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

if (num % i == 0) 

您应该知道这很容易出错,因为您使用double作为num的类型。您应该使用int代替。

答案 2 :(得分:2)

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

  

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

这对于浮点类型来说毫无意义。模数的定义取决于除法舍入为整数。

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

答案 3 :(得分:0)

此代码返回一个双重对象

(num / i)

仅允许int类型的模运算。您可以将其转换为int type

( ((int) (num / i) ) % i)