Twój pomysł jest z grubsza dobry, ale pomija jeden szczegół. Nie uwzględniasz przypadku, gdy liczba którą rozkładasz ma czynnik pierwszy większy od jej pierwiastka.
Np. dla liczby 105 Twój program sprawdzi, że dzieli się przez 3 i po podzieleniu zostanie Ci 35. Potem wyjdzie, że 35 dzieli się przez 5 i zostanie 7. I teraz będziesz sprawdzał czy 6 dzieli 7, ale 6 jest większe od pierwiastka z 7, więc pętla się zakończy. No i wyszło na to, że pominęliśmy 7.
Tak wygląda poprawny kod:
import math
def Rozklad(liczba):
k = 2
czynniki = []
# rozklad na czynniki pierwsze
while (k * k <= liczba):
if liczba % k == 0:
# jezeli czynnik jest nieparzysty to go dodajemy do listy
if k % 2 == 1:
czynniki.append(k)
# w przeciwnym wypadku funkcja zwraca falsz
else:
return False
liczba /= k
else:
k += 1
if liczba > 1:
czynniki.append(liczba)
# skoro maja byc 3 rozne czynniki to sprawdzamy to poprzez utowrzenie zbioru
czynniki2 = set(czynniki)
if len(czynniki2) == 3:
return True
else:
return False
wynik = 0
with open("liczby.txt") as file:
liczby = file.read().splitlines()
for liczba in liczby:
liczba = int(liczba)
if Rozklad(liczba):
wynik += 1
print(wynik)
Dodatkowo zmieniłem warunek w pętli na k*k <= liczba, żeby uniknąć działania na liczbach zmiennoprzecinkowych.