From 8498165fef7a7e9d1c01577f711e0fe19dfb145c Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 6 Apr 2010 06:48:23 +0200 Subject: [PATCH] init p1 to p9 --- p1.c | 24 ++++++++++++++++++++++ p2.c | 29 +++++++++++++++++++++++++++ p3.c | 44 ++++++++++++++++++++++++++++++++++++++++ p4.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++ p5.c | 31 +++++++++++++++++++++++++++++ p6.c | 22 ++++++++++++++++++++ p7.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++ p8.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ p9.c | 43 ++++++++++++++++++++++++++++++++++++++++ 9 files changed, 371 insertions(+) create mode 100644 p1.c create mode 100644 p2.c create mode 100644 p3.c create mode 100644 p4.c create mode 100644 p5.c create mode 100644 p6.c create mode 100644 p7.c create mode 100644 p8.c create mode 100644 p9.c diff --git a/p1.c b/p1.c new file mode 100644 index 0000000..a7a0e79 --- /dev/null +++ b/p1.c @@ -0,0 +1,24 @@ + +/* + * http://projecteuler.net + * + * Projecteuler - Problem 1 + * ------------------------ + * 2008-01-21 Henrik Hautakoski + */ + +#include + +#define mod(x) ((x % 5) == 0 || (x % 3) == 0) + +int main() { + + int i, r = 0; + + for(i=3; i < 1000; i++) + if (mod(i)) r += i; + + printf("%i\n", r); + + return 0; +} diff --git a/p2.c b/p2.c new file mode 100644 index 0000000..158443c --- /dev/null +++ b/p2.c @@ -0,0 +1,29 @@ + +/* + * http://projecteuler.net + * + * Projecteuler - Problem 2 + * ----------------------- + * 2008-03-11 Henrik Hautakoski + */ + +#include + +int main() { + + int c = 0, a = 1, b = 1, r = 0; + + while(c < 4000000) { + + c = a+b; + a = b; + b = c; + + if((c % 2) == 0) + r += c; + } + + printf("%i\n", r); + + return 0; +} diff --git a/p3.c b/p3.c new file mode 100644 index 0000000..1b4fe00 --- /dev/null +++ b/p3.c @@ -0,0 +1,44 @@ + +/* + * http://projecteuler.net + * + * Projecteuler - Problem 3 + * ------------------------ + * 10/01/10 (binary day :D) Henrik Hautakoski + * + * fast solution using euclidean algorithm for calculating gcd. + */ + +#include + +typedef unsigned long bint; + +bint gcd(bint a, bint b) { + + bint c; + + while(b != 0) { + c = b; + b = a % b; + a = c; + } + + return a; +} + +int main() { + + bint i, r = 0, n = 600851475143; + + for(i=2; i <= n ; i++) { + + if((r = gcd(n, i)) == 1) + continue; + + n /= r; + } + + printf("%li\n", r); + + return 0; +} diff --git a/p4.c b/p4.c new file mode 100644 index 0000000..19fbc09 --- /dev/null +++ b/p4.c @@ -0,0 +1,58 @@ + +/* + * http://projecteuler.net + * + * Projecteuler - Problem 4 + * ------------------------ + * 2009-12-28 Henrik Hautakoski + * + * A somewhat elegant solution (representing the numbers as a string is not so fancy) + */ + +#include + +int factor(int val) { + + int a; + + for(a=999; a > 99; a--) { + + if((val % a) == 0 && (val/a) < 999) + return a; + } + + return 0; +} + +int ispalindrom(int num) { + + int i, n; + char buffer[7]; + + sprintf(buffer, "%i", num); + for(n=0; buffer[n+1] != 0; n++); + + for(i=0; i < n-i; i++) { + + if (buffer[i] != buffer[n-i]) + return 0; + } + + return 1; +} + +int main() { + + int r, a; + + for(r=999999; r >= 100001; r--) { + + if (!ispalindrom(r) || !(a = factor(r))) + continue; + + printf("%i * %i = %i\n", r/a, a, r); + break; + } + + return 0; +} diff --git a/p5.c b/p5.c new file mode 100644 index 0000000..17e13a7 --- /dev/null +++ b/p5.c @@ -0,0 +1,31 @@ + +/* + * http://projecteuler.net + * + * Projecteuler - Problem 5 + * ------------------------ + * 2008-03-11 Henrik Hautakoski + */ + +#include + +int main() { + + int i, n = 20; + char r; + + do { + r = 0; + for(i=20; i > 10; i--) { + if ((n % i) != 0) { + n += 20; + r = 1; + break; + } + } + } while(r); + + printf("%i\n", n); + + return 0; +} diff --git a/p6.c b/p6.c new file mode 100644 index 0000000..8a9532e --- /dev/null +++ b/p6.c @@ -0,0 +1,22 @@ + +/* + * http://projecteuler.net + * + * Projecteuler - Problem 6 + * ------------------------ + * 2008-03-13 Henrik Hautakoski + */ + +#include + +int main() { + + int i, s1 = 1, s2 = 1; + + for(i=2; i <= 100; i++) { + s1 += i*i; + s2 += i; + } + + printf("%i\n", s2*s2 - s1); +} diff --git a/p7.c b/p7.c new file mode 100644 index 0000000..3210c5c --- /dev/null +++ b/p7.c @@ -0,0 +1,55 @@ + +/* + * http://projecteuler.net + * + * 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; +} + +int main() { + + int i, len = 3, *prime = malloc(sizeof(int)*10001); + + 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; + } + + printf("%i\n", prime[len-1]); + + free(prime); + + return 0; +} + diff --git a/p8.c b/p8.c new file mode 100644 index 0000000..0aefdf7 --- /dev/null +++ b/p8.c @@ -0,0 +1,65 @@ + +/* + * http://projecteuler.net + * + * Projecteuler - Problem 8 + * ------------------------ + * 2009-12-28 Henrik Hautakoski + * + * No comment! + */ + +#include + +#define N_CHARS 1000 + +#define BIGWALLOFTEXT \ +"73167176531330624919225119674426574742355349194934\ +96983520312774506326239578318016984801869478851843\ +85861560789112949495459501737958331952853208805511\ +12540698747158523863050715693290963295227443043557\ +66896648950445244523161731856403098711121722383113\ +62229893423380308135336276614282806444486645238749\ +30358907296290491560440772390713810515859307960866\ +70172427121883998797908792274921901699720888093776\ +65727333001053367881220235421809751254540594752243\ +52584907711670556013604839586446706324415722155397\ +53697817977846174064955149290862569321978468622482\ +83972241375657056057490261407972968652414535100474\ +82166370484403199890008895243450658541227588666881\ +16427171479924442928230863465674813919123162824586\ +17866458359124566529476545682848912883142607690042\ +24219022671055626321111109370544217506941658960408\ +07198403850962455444362981230987879927244284909188\ +84580156166097919133875499200524063689912560717606\ +05886116467109405077541002256983155200055935729725\ +71636269561882670428252483600823257530420752963450" + +int product(char *ptr, int n) { + + int i, r = 1; + + for(i=0; i < n; i++) + r *= ((int)ptr[i]) - 0x30; + + return r; +} + +int main() { + + int i; + char str[] = BIGWALLOFTEXT; + int tmp, r = 0; + + for(i=0; i < N_CHARS-5; i++) { + + tmp = product(&str[i], 5); + + if (tmp > r) + r = tmp; + } + + printf("%i\n", r); + + return 0; +} diff --git a/p9.c b/p9.c new file mode 100644 index 0000000..325324d --- /dev/null +++ b/p9.c @@ -0,0 +1,43 @@ + +/* + * http://projecteuler.net + * + * Projecteuler - Problem 9 + * ------------------------ + * 2010-04-06 Henrik Hautakoski + * + * the math stuff here (simple algebra) + * + * 1000 = a + b + c + * 10^6 = (a + b + c)^2 + * 10^6 = a^2 + ab + ac + ba + b^2 + bc + ca + cb + c^2 + * 10^6 = a^2 + b^2 + c^2 + 2(ab + ac + bc) + * 10^6 = 2a^2 + 2b^2 + 2(ab + ac + bc) (substitution: a^2 + b^2 = c^2, pythagorean theorem) + * 10^6/2 = a^2 + b^2 + ab + ac + bc + * 10^6/2 + ab = a^2 + b^2 + 2ab + ac + bc + * 10^6/2 + ab = (a + b)(a + b) + (a + b)c + * 10^6/2 + ab = (a + b + c)(a + b) + * 10^6/2 + ab = 1000a + 1000b (substitution: a + b + c = 1000) + * 10^6/2 = 1000a + 1000b - ab + * 10^6/2 = a(1000 - b) + 1000b + * + * Equation to use: a = (10^6/2 - 1000b)/(1000 - b) + */ + +#include + +int main() { + + int a, b; + double tmp; + + for(b=1; b < 1000; b++) { + a = tmp = (5e5 - 1000*b)/(1000 - b); + if (tmp - a >= 0.0 && (tmp - a) < .00000001) { + printf("%i\n", a*b*(1000 - (a+b))); + break; + } + } + + return 0; +}