Я работаю над очень маленькой программой, чтобы найти делители целого числа в C ++.
Мой основной метод в значительной степени помещает int в var и вызывает фактор-метод с аргументом int.
Вот код:
void factor(int num)
{
for(int x = 0; x < ((num + 2) / 2); x++)
{
if((num % x) == 0)
{
cout << x << " ";
}
}
}
Программа всегда вылетает внутри фактора ().
Если я использую этот код, он работает нормально:
void factor(int num)
{
for(int x = 0; x < ((num + 2) / 2); x++)
{
{
cout << x << " ";
}
}
}
Так что проблема где-то в if((num % x) == 0)
, Когда я изменяю эту строку на if((num % 2) == 0)
или же if((num % 5) == 0)
, он дает правильные результаты (я использую 32 в качестве входных данных теста).
Я изучил C ++ несколько лет назад и забыл большую часть его, после столкновения с этой проблемой я скопировал кодовое слово в слово из моего предыдущего решения этой проблемы (которое работало). Но программа все равно падает, когда я пытаюсь получить доступ к счетчику цикла.
Я использую Code :: Blocks 13.12 с GCC «4.9.0 20140604 (prerelease)» в 64-разрядной версии Arch Linux.
Проблема в том, что у вас есть деление на ноль в вашем первом фрагменте, то, что неопределенное-поведение в соответствии со стандартом (n3337):
5.6p4
Мультипликативные операторы[expr.mul]
Бинарный
/
оператор дает частное, а двоичный%
Оператор возвращает остаток от деления первого выражения на второе. Если второй операнд/
или же%
ноль, поведение не определено.
Так как программа не может вычислить значение такого выражения, она потерпит крах.
if((num % x) == 0) // num % 0 on first iteration, application will crash, or order pizza
{
cout << x << " ";
}
Как вы можете сделать num%x
когда х равен 0? Из-за использования x, когда это 0, программа вылетает.
Это может вызвать ошибку во время выполнения, которая, я полагаю, будет SIGFPE
,
В самом первом цикле for x имеет значение 0. num% x потребует деления на 0, что является математическим бессмысленным значением, и именно здесь происходит сбой.
Вы хотите увидеть все делители числа (они делят число, а 0 остается перенести). Вы должны начать цикл for с 2. (1 — это уже дано — вы можете распечатать его напрямую, но у вас будет только половина числа, поэтому я подозреваю, что вас не интересует 1 и само число).
Попробуйте начать цикл с x = 1
,
Начиная с 0 не имеет никакого смысла, если вы хотите вычислить факторы числа.
%
Оператор вычисляет остаток от деления num/x
, Деление на 0 не имеет никакого смысла, поэтому поведение операции не определено. Это означает, что он может потерпеть крах на одном компиляторе / машине и может дать какой-то результат на другом компиляторе / машине.