p0010_s4.c

problem 10 · 23 lines

/* Solution to Euler Problem 10: Summation of Primes. */
#include "runner.h"
#include <primesieve.h>

/* Sum primes below max_num via the primesieve library's optimised wheel-factorised sieve; ~O(n). */
const char *solve(int argc, char *argv[]) {
    static char _answer[32];
    int max_num = parse_int(argv[1]);
    if (max_num < 2) { snprintf(_answer, sizeof _answer, "%lld", (long long)(0)); return _answer; }
    /* Sum of primes in [2, max_num - 1] */
    size_t size = 0;
    uint64_t *primes = (uint64_t *)primesieve_generate_primes(
        2, (uint64_t)(max_num - 1), &size, UINT64_PRIMES);
    if (!primes) { snprintf(_answer, sizeof _answer, "%lld", (long long)(0)); return _answer; }

    long long sum = 0;
    for (size_t i = 0; i < size; i++) {
        sum += (long long)primes[i];
    }
    primesieve_free(primes);
    { snprintf(_answer, sizeof _answer, "%lld", (long long)(sum)); return _answer; }
}