#include <vector>
#include <cmath>
#include <cstring>
int countPrimes_vector(int n) {
int res = 0;
std::vector<bool> bitmap(n, true);
for (int i = 2; i<n; ++i){
if(bitmap[i])
++res;
if(sqrt(n)>i)
{
for(int j = i*i; j < n; j += i) bitmap[j] = false;
}
}
return res;
}
int countPrimes_carray(int n) {
int res = 0;
bool* bitmap = new bool[n];
memset(bitmap, true, sizeof(bool) * n);
for (int i = 2; i<n; ++i){
if(bitmap[i])++res;
if(sqrt(n)>i)
{
for(int j = i*i; j < n; j += i) bitmap[j] = false;
}
}
delete []bitmap;
return res;
}
#include <chrono>
#include <iostream>
using namespace std;
void test(const char* description, int (*fn)(int))
{
using clock = std::chrono::steady_clock;
using ms = std::chrono::milliseconds;
auto start = clock::now();
int a;
for(int i=0; i<9; ++i)
a = countPrimes_vector(8000000);
auto end = clock::now();
auto diff = std::chrono::duration_cast<ms>(end - start);
std::cout << "time for " << description << " = " << diff.count() << "ms\n";
}
int main()
{
test("carray", countPrimes_carray);
test("vector", countPrimes_vector);
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8Y3N0cmluZz4KCmludCBjb3VudFByaW1lc192ZWN0b3IoaW50IG4pIHsgIAogICAgaW50IHJlcyA9IDA7IAogICAgc3RkOjp2ZWN0b3I8Ym9vbD4gYml0bWFwKG4sIHRydWUpOwogICAgZm9yIChpbnQgaSA9IDI7IGk8bjsgKytpKXsKICAgICAgICBpZihiaXRtYXBbaV0pCiAgICAgICAgICArK3JlczsKICAgICAgICBpZihzcXJ0KG4pPmkpCiAgICAgICAgewogICAgICAgICAgICAgZm9yKGludCBqID0gaSppOyBqIDwgbjsgaiArPSBpKSBiaXRtYXBbal0gPSBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzOwp9CgppbnQgY291bnRQcmltZXNfY2FycmF5KGludCBuKSB7ICAKICAgIGludCByZXMgPSAwOyAKICAgIGJvb2wqIGJpdG1hcCA9IG5ldyBib29sW25dOwogICAgbWVtc2V0KGJpdG1hcCwgdHJ1ZSwgc2l6ZW9mKGJvb2wpICogbik7CiAgICBmb3IgKGludCBpID0gMjsgaTxuOyArK2kpewoKICAgICAgICBpZihiaXRtYXBbaV0pKytyZXM7CiAgICAgICAgaWYoc3FydChuKT5pKQogICAgICAgIHsKICAgICAgICAgICAgIGZvcihpbnQgaiA9IGkqaTsgaiA8IG47IGogKz0gaSkgYml0bWFwW2pdID0gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgZGVsZXRlIFtdYml0bWFwOwogICAgcmV0dXJuIHJlczsKfQoKI2luY2x1ZGUgPGNocm9ubz4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZvaWQgdGVzdChjb25zdCBjaGFyKiBkZXNjcmlwdGlvbiwgaW50ICgqZm4pKGludCkpCnsKICAgIHVzaW5nIGNsb2NrID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazsKICAgIHVzaW5nIG1zID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kczsKCiAgICBhdXRvIHN0YXJ0ID0gY2xvY2s6Om5vdygpOwoKICAgIGludCBhOwogICAgZm9yKGludCBpPTA7IGk8OTsgKytpKQogICAgICAgIGEgPSBjb3VudFByaW1lc192ZWN0b3IoODAwMDAwMCk7IAoKICAgIGF1dG8gZW5kID0gY2xvY2s6Om5vdygpOwogICAgYXV0byBkaWZmID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8bXM+KGVuZCAtIHN0YXJ0KTsKCiAgICBzdGQ6OmNvdXQgPDwgInRpbWUgZm9yICIgPDwgZGVzY3JpcHRpb24gPDwgIiA9ICIgPDwgZGlmZi5jb3VudCgpIDw8ICJtc1xuIjsKfQoKaW50IG1haW4oKQp7CiAgICB0ZXN0KCJjYXJyYXkiLCBjb3VudFByaW1lc19jYXJyYXkpOwogICAgdGVzdCgidmVjdG9yIiwgY291bnRQcmltZXNfdmVjdG9yKTsKfQo=