Przeanalizujmy złożoność obliczeniową twojego programu, zaczynając od tej funkcji
long int czypierwsza(int liczba)
{
if (liczba < 2)
return false;
for (int j = 2; j * j <= liczba; j++)
if (liczba % j == 0)
return false;
return true;
}
Najgorszy przypadek jest kiedy liczba jest pierwsza i będziesz musiał przejść ~sqrt(liczba) iteracji pętli.
Teraz ten kawałek kodu
while (wejscie >> liczba)
{
for (int i = 3; i <= liczba; i++)
{
if (czypierwsza(i) == true)
{
if (liczba % i == 0)
{
licznik_czynniki++;
if (licznik_czynniki == 3)
break;
}
}
}
ilosc_liczb++;
licznik_czynniki = 0;
}
Pętla while wykona się maksymalnie 1000 razy wynika to z treści zadania, druga pętla wykona się pesymistycznie ~10^9 razy, Każda iteracja pętli for kosztuje sqrt(liczba).
Łącząc to wszystko dostajemy 1000*10^9*sqrt(liczba) co można oszacować od góry jako 10^15.5 operacji. Procesor o częstotliwości 3GHz może policzyć 3*10^9 operacji na sekunde więc dostajesz ok 10^6.5/3 sekund to jest około 12 dni.
Podsumowując masz zły algorytm rozwiązania zadania. Możesz sobie poczytać o troche sprytniejszej implementacji sita erastotenesa tutaj, powinno to rozwiązać twoje problemy.