Вы получаете кратные вашим основным факторам, таким как 6 = 2 × 3, 10 = 2 × 5 и 15 = 3 × 5.
Чтобы избежать этого, вы должны разделить свое первоначальное число на простые факторы, как вы находите их, так что он не будет делиться снова на кратные эти простые факторы.
Кроме того, вы должны делать это многократно, так как числа часто имеют показатель простого фактора (для например, 12 = 2² × 3, поэтому вы должны разделить на 2 дважды.)
for i in range(2, num):
while num % i == 0:
flist.append(i)
num = num // i
if num == 1:
break
Когда вы доберетесь до 1, вы знаете, что можете остановиться.
Есть и другие оптимизации, которые вы например, когда i² больше num, вы знаете, что num должно быть простым числом, поскольку вы уже поделили его на все факторы, меньшие i.
Вы также можете пропустить четные числа после 2, так как они будут никогда не будьте факторами.
Используя простой код выше, вы будете знать, что num - это простое число, когда flist пуст. (Вам не нужен дополнительный переключатель для отслеживания этого.) Это работает, так как вы никогда не делите на само num, поэтому, если вы дойдете до конца и не делите один раз, это означает, что это простое число.
Для числа, такого как 12, у вашего флиста будет [2, 2, 3]
. Если вам нужны уникальные простые множители без повторений, вы можете использовать set(flist)
, чтобы избавиться от дубликатов.