Друк простих чисел у заданому діапазоні за допомогою C++ STL
Згенеруйте всі прості числа між двома заданими числами. Завдання полягає в тому, щоб надрукувати прості числа в цьому діапазоні. The Решето Ератосфена це один із найефективніших способів знайти всі прості числа, менші за n, де n менше ніж 10 мільйонів або близько того. приклади:
Input : start = 50 end = 100 Output : 53 59 61 67 71 73 79 83 89 97 Input : start = 900 end = 1000 Output : 907 911 919 929 937 941 947 953 967 971 977 983 991 997
Рекомендовано: розв’яжіть це на ПРАКТИКА перш ніж переходити до вирішення.
Ідея полягає в тому, щоб використовувати Сито Ератосфена як підпрограму. Спочатку знайдіть прості числа в діапазоні від 0 до початку та збережіть їх у векторі. Подібним чином знайдіть прості числа в діапазоні від 0 до кінця та збережіть в іншому векторі. Тепер візьмемо задану різницю двох векторів, щоб отримати необхідну відповідь. Видаліть зайві нулі у векторі, якщо вони є.
CPP // C++ STL program to print all primes // in a range using Sieve of Eratosthenes #include using namespace std ; typedef unsigned long long int ulli ; vector < ulli > sieve ( ulli n ) { // Create a boolean vector 'prime[0..n]' and // initialize all entries it as true. A value // in prime[i] will finally be false if i is // Not a prime else true. vector < bool > prime ( n + 1 true ); prime [ 0 ] = false ; prime [ 1 ] = false ; int m = sqrt ( n ); for ( ulli p = 2 ; p <= m ; p ++ ) { // If prime[p] is not changed then it // is a prime if ( prime [ p ]) { // Update all multiples of p for ( ulli i = p * 2 ; i <= n ; i += p ) prime [ i ] = false ; } } // push all the primes into the vector ans vector < ulli > ans ; for ( int i = 0 ; i < n ; i ++ ) if ( prime [ i ]) ans . push_back ( i ); return ans ; } // Used to remove zeros from a vector using // library function remove_if() bool isZero ( ulli i ) { return i == 0 ; } vector < ulli > sieveRange ( ulli start ulli end ) { // find primes from [0..start] range vector < ulli > s1 = sieve ( start ); // find primes from [0..end] range vector < ulli > s2 = sieve ( end ); vector < ulli > ans ( end - start ); // find set difference of two vectors and // push result in vector ans // O(2*(m+n)-1) set_difference ( s2 . begin () s2 . end () s1 . begin () s2 . end () ans . begin ()); // remove extra zeros if any. O(n) vector < ulli >:: iterator itr = remove_if ( ans . begin () ans . end () isZero ); // resize it. // O(n) ans . resize ( itr - ans . begin ()); return ans ; } // Driver Program to test above function int main ( void ) { ulli start = 50 ; ulli end = 100 ; vector < ulli > ans = sieveRange ( start end ); for ( auto i : ans ) cout < < i < < ' ' ; return 0 ; }
Вихід
53 59 61 67 71 73 79 83 89 97
Часова складність: O(NlogN), де N – різниця між інтервалами.
Допоміжний простір: O(N) для зберігання логічного вектора.
Створіть вікторину