From 2ba8a8aaebb3c49ed8fa2a36b98f8a4d999d7156 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 9 Apr 2010 16:20:42 +0200 Subject: [PATCH] problem 10 done, and problem 7 rewritten (new is_prime algorithm) --- lib/prime.c | 18 ++++++++++++++++++ lib/prime.h | 10 ++++++++++ p10.c | 25 +++++++++++++++++++++++++ p7.c | 47 +++++++++++------------------------------------ 4 files changed, 64 insertions(+), 36 deletions(-) create mode 100644 lib/prime.c create mode 100644 lib/prime.h create mode 100644 p10.c diff --git a/lib/prime.c b/lib/prime.c new file mode 100644 index 0000000..fc54d34 --- /dev/null +++ b/lib/prime.c @@ -0,0 +1,18 @@ + +#include "prime.h" +#include + +int is_prime(uint32_t p) { + + uint32_t i, l; + + if (p < 2 || (p & 1) == 0) + return 0; + + l = ((uint32_t)sqrt(p)) + 1; + + for(i=3; i < l; i+=2) + if (p % i == 0) return 0; + + return 1; +} diff --git a/lib/prime.h b/lib/prime.h new file mode 100644 index 0000000..2a5a814 --- /dev/null +++ b/lib/prime.h @@ -0,0 +1,10 @@ + +#ifndef __PRIME_H + +#define __PRIME_H + +#include + +int is_prime(uint32_t p); + +#endif /* __PRIME_H */ diff --git a/p10.c b/p10.c new file mode 100644 index 0000000..e2ee6fd --- /dev/null +++ b/p10.c @@ -0,0 +1,25 @@ + +/* + * http://projecteuler.net + * + * Projecteuler - Problem 10 + * ------------------------ + * 2010-04-06 Henrik Hautakoski + */ + +#include +#include "lib/prime.h" + +int main() { + + uint32_t i; + uint64_t s = 2; + + for(i=3; i < 2e6; i+=2) { + if (is_prime(i)) + s += i; + } + printf("%lli\n", s); /* this format throws som warnings but works so whatever */ + + return 0; +} diff --git a/p7.c b/p7.c index 3210c5c..a64e82d 100644 --- a/p7.c +++ b/p7.c @@ -5,50 +5,25 @@ * Projecteuler - Problem 7 * ------------------------ * 2009-12-28 Henrik Hautakoski - * - * fast and elegant solution using The fundamental theorem of arithmetic wich state: - * any natural number greater than 1 can be prime factorized in only one unique way - * unless it is prime itself. */ #include -#include - -int isprime(int *pl, int l, int p) { - - int i; - - for(i=0; i < l; i++) { - - if((p % pl[i]) == 0) - return 0; - } - - return 1; -} +#include "lib/prime.h" int main() { - int i, len = 3, *prime = malloc(sizeof(int)*10001); + uint32_t i, p, n = 1; - if (prime == NULL) - return 1; - - prime[0] = 2; - prime[1] = 3; - prime[2] = 5; - - for(i=6; len < 10001; i++) { - - if(!isprime(prime, len, i)) - continue; - - prime[len++] = i; - } + for(i=3; n < 10001; i+=2) { - printf("%i\n", prime[len-1]); - - free(prime); + if (!is_prime(i)) + continue; + + p = i; + n++; + } + + printf("%i\n", p); return 0; }