Поскольку каждый элемент сита содержит только 0 или 1, нет необходимости использовать long long int
для хранения каждого элемента.std::vector<bool>
потенциально использует 1 бит на элемент и, таким образом, является оптимальным для эффективности памяти.
Вот ваш код с очень небольшим количеством модификаций для использования std::vector<bool>
.Поскольку для получения и установки отдельных элементов требуется некоторая битовая манипуляция, эта версия может быть медленнее, чем код, который использует один байт или элемент int для каждого элемента sieve.Вы можете сравнить различные версии и выбрать подходящий компромисс для своих нужд.
#include <cmath>
#include <cstddef>
#include <exception>
#include <iostream>
#include <string>
#include <vector>
// returns the number of primes <= n
long isprime(long n) {
std::vector<bool> prime(n + 1);
for (long i = 0; i <= n; i++) {
prime[i] = 1;
}
prime[0] = prime[1] = 0;
long upper_bound = std::sqrt(n);
for (long i = 2; i <= upper_bound; i++) {
if (prime[i] == 1) {
for (long j = 2; i * j <= n; j++)
prime[i * j] = 0;
}
}
long num_primes = 0;
for (long i = 0; i <= n; i++) {
if (prime[i] == 1) {
++num_primes;
// std::cout << i << std::endl;
}
}
return num_primes;
}
int main() {
std::cout << "Enter the sieve size: ";
std::string line;
std::getline(std::cin, line);
std::cout << std::endl;
long len = std::stol(line);
long num_primes = isprime(len);
std::cout << "There are " << num_primes << " primes <= " << len << std::endl;
return 0;
}