Skip to content

Commit

Permalink
Problem 65: convergents of e
Browse files Browse the repository at this point in the history
  • Loading branch information
pbevin committed Dec 17, 2013
1 parent cc49332 commit 24a4fa8
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 6 deletions.
6 changes: 0 additions & 6 deletions eu064.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,6 @@ void eu064(char *ans) {
int d = 1;
int i;

// sqrt(n) = a + 1/x
// Solving for x,
// x = 1/(sqrt(n) - a)
// = (sqrt(n) + a) / (n - a^2)
// = b + (sqrt(n) + c) / (n-a^2)
// where
for (i = 0; a != 2 * a0; i++) {
int m1 = d * a - m;
int d1 = (n - m1*m1) / d;
Expand Down
38 changes: 38 additions & 0 deletions eu065.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#include "euler.h"

static int eterm(int n) {
if (n == 0) {
return 2;
} else if (n % 3 == 2) {
return 2 * (1 + n / 3);
} else {
return 1;
}
}

void eu065(char *ans) {
int N = 99;
mpz_t n, d, r;

mpz_init(n);
mpz_init(d);
mpz_init(r);

mpz_set_ui(n, eterm(N));
mpz_set_ui(d, 1);

for (int i = N-1; i >= 0; i--) {
mpz_swap(n, d);
int t = eterm(i);
mpz_addmul_ui(n, d, t);
mpz_gcd(r, n, d);
mpz_div(n, n, r);
mpz_div(d, d, r);
/* char bn[100], bd[100]; */
/* mpz_get_str(bn, 10, n); */
/* mpz_get_str(bd, 10, d); */
/* printf("%d: %d -> %s/%s\n", i, t, bn, bd); */
}

sprintf(ans, "%d", digitsum(n));
}
10 changes: 10 additions & 0 deletions euler.c
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,15 @@ subint(char *s, int i, int j) {
}


int digitsum(mpz_t z) {
static char buf[10000];
char *p = mpz_get_str(buf, 10, z);
int digitsum = 0;
for (int i = 0; p[i]; i++) {
digitsum += todigit(p[i]);
}
return digitsum;
}

int gcd(int a, int b) {
int t;
Expand Down Expand Up @@ -240,6 +249,7 @@ struct puzzle puzzles[] = {
{ "062", &eu062, "127035954683" },
{ "063", &eu063, "49" },
{ "064", &eu064, "1322" },
{ "065", &eu065, "272" },
};

#define NPUZZLES (sizeof puzzles / sizeof(puzzles[0]))
Expand Down
1 change: 1 addition & 0 deletions euler.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ extern char *nextperm(char *s);
extern char *prevperm(char *s);
extern int subint(char *s, int i, int j);
extern int gcd(int a, int b);
extern int digitsum(mpz_t z);


typedef void (solver)(char *ans);
Expand Down

0 comments on commit 24a4fa8

Please sign in to comment.