summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/projecteuler/065.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/projecteuler/065.c b/src/projecteuler/065.c
new file mode 100644
index 0000000..3e93085
--- /dev/null
+++ b/src/projecteuler/065.c
@@ -0,0 +1,40 @@
+#include <gmp.h>
+#include <stdio.h>
+
+#define limit 100
+
+unsigned int start = 2;
+unsigned int factors[limit-1];
+
+int main(void)
+{
+ int pos, k=1, sum;
+ mpz_t numerator, denominator;
+
+ for(pos=0; pos<limit-1; pos++)
+ {
+ if(pos % 3 == 1)
+ factors[pos] = 2*(k++);
+ else
+ factors[pos] = 1;
+ }
+
+ mpz_init_set_ui(numerator, 1);
+ mpz_init_set_ui(denominator, factors[limit-2]);
+ for(pos=limit-3; pos>=0; pos--)
+ {
+ mpz_addmul_ui(numerator, denominator, factors[pos]); // numerator *= denominator * factors[pos]
+ mpz_swap(numerator, denominator);
+ }
+
+ mpz_addmul_ui(numerator, denominator, start); // numerator += denominator * start
+
+ sum = 0;
+ while(mpz_cmp_ui(numerator, 0) > 0)
+ sum += mpz_fdiv_q_ui(numerator, numerator, 10);
+
+ printf("%li\n", sum);
+
+ return 0;
+}
+