математика — программа C ++ падает, когда счетчик используется внутри цикла

Я работаю над очень маленькой программой, чтобы найти делители целого числа в 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.

0

Решение

Проблема в том, что у вас есть деление на ноль в вашем первом фрагменте, то, что неопределенное-поведение в соответствии со стандартом (n3337):

5.6p4 Мультипликативные операторы [expr.mul]

Бинарный / оператор дает частное, а двоичный % Оператор возвращает остаток от деления первого выражения на второе. Если второй операнд / или же % ноль, поведение не определено.


Так как программа не может вычислить значение такого выражения, она потерпит крах.

if((num % x) == 0)  // num % 0 on first iteration, application will crash, or order pizza
{
cout << x << " ";
}
7

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

Как вы можете сделать num%x когда х равен 0? Из-за использования x, когда это 0, программа вылетает.

Это может вызвать ошибку во время выполнения, которая, я полагаю, будет SIGFPE,

2

В самом первом цикле for x имеет значение 0. num% x потребует деления на 0, что является математическим бессмысленным значением, и именно здесь происходит сбой.

Вы хотите увидеть все делители числа (они делят число, а 0 остается перенести). Вы должны начать цикл for с 2. (1 — это уже дано — вы можете распечатать его напрямую, но у вас будет только половина числа, поэтому я подозреваю, что вас не интересует 1 и само число).

0

Попробуйте начать цикл с x = 1,

Начиная с 0 не имеет никакого смысла, если вы хотите вычислить факторы числа.
% Оператор вычисляет остаток от деления num/x, Деление на 0 не имеет никакого смысла, поэтому поведение операции не определено. Это означает, что он может потерпеть крах на одном компиляторе / машине и может дать какой-то результат на другом компиляторе / машине.

0
По вопросам рекламы [email protected]