commit 8498165fef7a7e9d1c01577f711e0fe19dfb145c Author: Henrik Hautakoski Date: Tue Apr 6 06:48:23 2010 +0200 init p1 to p9 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; +}