Как вы сказали, для 39 это не работает.Вы проверили, что он делает с 39?Вы должны сделать это, так как это лучший способ отладки вашей программы.
Давайте посмотрим на это вместе.Сначала он пытается найти все факторы и находит 1, 3 и 13: это выглядит нормально.
Затем он проверяет, является ли каждое из этих чисел квадратичным, и все они равны: это также выглядит правильно.
Затем он проверяет, удовлетворяет ли какой-либо из квадратичных факторов равенству, которое вы ищете.Ни один из них не делает (39 - 3 x 13, нет никакого способа, которым это может содержать квадратный фактор).Это означает, что if (int(sqrt(n / x)) == sqrt(n / x))
никогда не соответствует действительности, и этот блок никогда не запускается.Каковы значения sqfree_number
и squared
на тот момент?Это никогда не инициализируется.Использование неинициализированных значений приводит к «неопределенному поведению», то есть ваша программа может делать все что угодно.В этом случае p
и q
содержат случайные значения.
Как это можно исправить?Учтите это: если n
не удовлетворяет вашему уравнению, то есть оно не может быть выражено как pq * q, что именно должна выводить программа?Будет ли ваш вывод, как сейчас, когда-либо иметь смысл?Нет. Это означает, что вы должны изменить свою программу так, чтобы она охватывала случай, который вы не рассматривали.
Можно добавить bool found = false;
непосредственно перед вашим последним циклом for
.Когда вы найдете факторы, прежде чем нарушать, установите эту переменную на true
.Затем, вне цикла, проверьте: это true
?Тогда вы можете вернуть правильные значения.Но если это все еще false
, это означает, что равенство не выполняется, и вы не можете вернуть правильные значения.Вы должны найти способ сообщить об этом вызывающей стороне (это ваша функция main
), чтобы она могла напечатать соответствующее сообщение.
И как вы можете сообщить об этом?В общем, вы можете изменить Factorise_the_number
(кстати, имя функций должно начинаться со строчной буквы; заглавные буквы обычно используются для классов), чтобы вернуть bool
.Или вы можете использовать хитрость: вернуть специальное значение для p
и q
, которое не может быть результатом вычисления.Нравится -1.Затем, перед печатью, проверьте: если значения -1, это означает, что число не может быть выражено как pq * q.