From a85ae27bbe32e8d74c49517b0f9d5713c07cdc6f Mon Sep 17 00:00:00 2001 From: Reiner Herrmann Date: Thu, 23 Sep 2010 01:54:01 +0200 Subject: projecteuler solution 134 --- src/projecteuler/134.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/projecteuler/134.c diff --git a/src/projecteuler/134.c b/src/projecteuler/134.c new file mode 100644 index 0000000..3f6ea32 --- /dev/null +++ b/src/projecteuler/134.c @@ -0,0 +1,59 @@ +#include "common.h" +#include + +// TODO: improve performance! not yet working on 32 bit systems + +unsigned int getmod(unsigned long p1) +{ + unsigned int mod = 1; + + if(p1 < 10) + mod = 10; + else if(p1 < 100) + mod = 100; + else if(p1 < 1000) + mod = 1000; + else if(p1 < 10000) + mod = 10000; + else if(p1 < 100000) + mod = 100000; + else if(p1 < 1000000) + mod = 1000000; + else + mod = 0; // should not occur and therefore result in division by zero + + return mod; +} + +unsigned long findn(unsigned long p1, unsigned long p2) +{ + unsigned int mod = getmod(p1); + unsigned long n = mod + p1; + while(n % p2 != 0) + n += mod; + + return n; +} + +int main(void) +{ + unsigned long* p = primes(1000020); + unsigned long pcount = p[0]; + unsigned long p1, p2, pos; + unsigned long long result = 0; + + for(pos=3; p[pos]<=1000000; pos++) + { + p1 = p[pos]; + p2 = p[pos+1]; + if(pos%1000==0) + printf("p1: %li\n", p1); + result += findn(p1, p2); + } + + printf("%li\n", result); + + free(p); + return 0; +} + -- cgit v1.2.3