Trochę popatrzyłem i algorytm nie jest do końca dobry. Nawet w treści zadania masz, że 34 spełnia warunki zadania, bo jest iloczynem 2*17. Jednakże jeśli do pliku, na przykład w miejsce pierwszej wartości wstawimy 34, to nie zostanie owa wartość wypisana na ekranie, tak więc algorytm jest nieprawidłowy.
W dodatku zmień warunek
for (int i = 2; i <= r; i++)
na taki:
for (int i = 2; i <= sqrt(r); i++)
Działa tak samo, ale jest o wiele mniej obliczeń.
Zapewne błędne zliczanie wynika z Twojego pomysłu na algorytm, to jest:
for (int i = 0; i < 500; i++) {
if (!pierwsze[liczby[i]]) {
int lewy = 2; int prawy = pomoc.size()-1;
while (lewy <= prawy && pomoc[lewy] * pomoc[prawy] != liczby[i]) {
if (pomoc[lewy] * pomoc[prawy] < liczby[i]) lewy++;
else if (pomoc[lewy] * pomoc[prawy] > liczby[i]) prawy--;
}
if (lewy <= prawy) {
ile++;
cout << liczby[i] << " " << pomoc[lewy] << " " << pomoc[prawy] << "\n";
}
}
}
Ogółem na Twoim miejscu zmieniłbym również ilość liczb pierwszych, jakie sprawdzasz. W warunkach zadaniach masz powiedziane, że są to liczby maksymalnie sześciocyfrowe oraz szukamy jednocześnie liczb, które są iloczynami dwóch liczb pierwszych. A to oznacza, że najmniejszym dzielnikiem szukanych liczb jest 2. Oczywiście nie dla każdej liczby dwa będzie dzielnikiem, ale jeśli podzielimy liczbę pół-pierwszą przez liczbę większą od 2, to otrzymamy liczbę mniejszą od tej samej liczby podzielonej przez 2.
Aby było jaśniej dam przykład:
100/2 = 50, ale już 100/3 = 33 i 1/3. Wobec tego jeśli mianownik rośnie, to wynik maleje.
Wobec powyższej uwagi szukałbym w Twoim algorytmie sita liczb nie większych niż (999999/2).
Dodam, że ta mała zmiana Twojej zmiennej r na r = (999999/2) przyspieszyła wykonanie programu (u mnie) o jakieś 0.3 sekundy, więc możesz sobie wyobrazić, jak dużo mniej działań zostało wykonanych
EDIT: No dobra, poszperałem Trochę i już wiem, gdzie masz błąd.
Mianowicie:
int lewy = 2; int prawy = pomoc.size()-1;
Niby nic takiego, prawda? Tyle, że potem odwołujesz się do pomoc[lewy]. Wobec tego nie dopuszczasz w ogóle możliwości, że jedną ze składowych iloczynu liczby jest 2 lub 3.