#include #include using namespace std; list* sieve_of_euler(int upper_bound); list* range_list(int low, int high); list* scale_list(list* lst, int scalar); list* filter_list(list* lst, list* mask); int main() { int upper_bound = 100000; cout << "Enter the upper bound: "; cin >> upper_bound; list* primes = sieve_of_euler(upper_bound); for (list::iterator it = primes->begin(); it != primes->end(); it++) { cout << (*it) << endl; } delete primes; return 0; } // Returns a list of all the primes up to and including upper_bound. list* sieve_of_euler(int upper_bound) { list* primes = new list(); list* working_list = range_list(2, upper_bound); while (true) { int front = working_list->front(); bool reached_square_root = front * front >= upper_bound; if (reached_square_root) { for (list::iterator it = working_list->begin(); it != working_list->end(); it++) { primes->push_back(*it); } delete working_list; break; } else { primes->push_back(front); list* scaled_by_front = scale_list(working_list, front); list* multiples_removed = filter_list(working_list, scaled_by_front); delete scaled_by_front; delete working_list; working_list = multiples_removed; working_list->pop_front(); } } return primes; } list* range_list(int low, int high) { list* result = new list(); int value = low; while (value <= high) { result->push_back(value); value++; } return result; } list* scale_list(list* lst, int scalar) { list* result = new list(); for (list::iterator it = lst->begin(); it != lst->end(); it++) { result->push_back(scalar * (*it)); } return result; } // Every element in the first list, but not the second is returned in // the new list. Assumes the two input lists are sorted in ascending // order. list* filter_list(list* lst, list* mask) { list* result = new list(); list::iterator mask_it = mask->begin(); for (list::iterator main_it = lst->begin(); main_it != lst->end(); main_it++) { int main_elem = *main_it; int mask_elem = *mask_it; if (main_elem < mask_elem) result->push_back(main_elem); else if (main_elem == mask_elem) mask_it++; } return result; }