summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/projecteuler/134.c59
1 files changed, 59 insertions, 0 deletions
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 <stdlib.h>
+
+// 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;
+}
+