C ++ тест на делимость с двойным

почему не ((num / i) % 1 == 0) работать в C ++, когда Num является двойным? и как бы я вместо этого написал этот код, который проверяет факториалы, проверяя, оставляет ли он остаток (и т. д. 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;
}

3

Решение

На самом деле, что вы хотите сделать, это проверить, если n делится на i так что все, что вам нужно изменить, это

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

в

if (num % i == 0)

Вы должны знать, что это подвержено ошибкам, потому что вы используете double как тип для num, Вы должны использовать int вместо.

5

Другие решения

% Оператор допускается только для целочисленных типов (и определяется пользователем
типы, которые его перегружают). Для плавающей запятой вам нужна функция
fmod,

7

% оператор определяется C ++ 11 §5.6 / 4:

если частное a / b представимо в типе результата, (a / b) * b + a% b равно a.

Это бессмысленно для типов с плавающей точкой. Определение модуля зависит от округления деления до целого числа.

Как говорит Джеймс Канзе, используйте std::fmod вместо.

2

Этот код вернет вам двойной объект

(num / i)

Операция по модулю разрешена только для типа int. Вы можете преобразовать это в тип int

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