Как я понимаю, проблема в том, что вы должны генерировать все простые числа в диапазоне [m, n].
Способ сделать это без необходимости вычислять все простые числа из [0, n], потому что это, скорее всего, замедляет вас, - сначала сгенерировать все простые числа в диапазоне [0, sqrt (n)].
Затем используйте результат для просеивания в диапазоне [m, n]. Чтобы сгенерировать начальный список простых чисел, реализуйте базовую версию решета Эратосфена (в основном просто наивная реализация из псевдокода в статье в Википедии).
Это позволит вам решить проблему за очень короткое время.
Вот простой пример реализации сита Эратосфена:
std::vector<unsigned> sieve( unsigned n ) {
std::vector<bool> v( limit, true ); //Will be used for testing numbers
std::vector<unsigned> p; //Will hold the prime numbers
for( unsigned i = 2; i < n; ++i ) {
if( v[i] ) { //Found a prime number
p.push_back(i); //Stuff it into our list
for( unsigned j = i + i; j < n; j += i ) {
v[i] = false; //Isn't a prime/Is composite
}
}
}
return p;
}
Возвращает вектор, содержащий только простые числа от 0 до n. Затем вы можете использовать это для реализации метода, который я упомянул. Теперь я не буду предоставлять реализацию для вас, но вам нужно сделать то же самое, что и в сите Эратосфена, но вместо использования всех целых чисел [2, n], вы просто используете результат, который вы нашли. Не уверен, что это слишком много?