# eagletmt/project-euler-c

1 parent 32c2548 commit 235e3df3c51cb1517f772a9865b5b531d9b40027 committed Jun 2, 2009
Showing with 517 additions and 0 deletions.
1. +31 −0 10-19/problem10.c
2. +57 −0 10-19/problem11.c
3. +36 −0 10-19/problem12.c
4. +138 −0 10-19/problem13.c
5. +34 −0 10-19/problem14.c
6. +27 −0 10-19/problem15.c
7. +32 −0 10-19/problem16.c
8. +62 −0 10-19/problem17.c
9. +50 −0 10-19/problem18.c
10. +50 −0 10-19/problem19.c
 @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2009, eagletmt + * Released under the MIT License + */ + +#include +#include + +int main(void) +{ + char *sieve; + unsigned i, j; + size_t n = 2000000; + unsigned long long sum = 0ULL; + + sieve = calloc(n, sizeof *sieve); + for (i = 2; i < n; i++) { + if (!sieve[i]) { + sum += i; + for (j = i*2; j < n; j += i) { + sieve[j] = 1; + } + } + } + free(sieve); + + printf("%llu\n", sum); + + return 0; +} +
 @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2009, eagletmt + * Released under the MIT License + */ + +#include + +#define N 20 + +static __inline unsigned max(unsigned a, unsigned b); + +int main(void) +{ + unsigned grid[20][20] = { + {8,2,22,97,38,15,0,40,0,75,4,5,7,78,52,12,50,77,91,8}, + {49,49,99,40,17,81,18,57,60,87,17,40,98,43,69,48,4,56,62,0}, + {81,49,31,73,55,79,14,29,93,71,40,67,53,88,30,3,49,13,36,65}, + {52,70,95,23,4,60,11,42,69,24,68,56,1,32,56,71,37,2,36,91}, + {22,31,16,71,51,67,63,89,41,92,36,54,22,40,40,28,66,33,13,80}, + {24,47,32,60,99,3,45,2,44,75,33,53,78,36,84,20,35,17,12,50}, + {32,98,81,28,64,23,67,10,26,38,40,67,59,54,70,66,18,38,64,70}, + {67,26,20,68,2,62,12,20,95,63,94,39,63,8,40,91,66,49,94,21}, + {24,55,58,5,66,73,99,26,97,17,78,78,96,83,14,88,34,89,63,72}, + {21,36,23,9,75,0,76,44,20,45,35,14,0,61,33,97,34,31,33,95}, + {78,17,53,28,22,75,31,67,15,94,3,80,4,62,16,14,9,53,56,92}, + {16,39,5,42,96,35,31,47,55,58,88,24,0,17,54,24,36,29,85,57}, + {86,56,0,48,35,71,89,7,5,44,44,37,44,60,21,58,51,54,17,58}, + {19,80,81,68,5,94,47,69,28,73,92,13,86,52,17,77,4,89,55,40}, + {4,52,8,83,97,35,99,16,7,97,57,32,16,26,26,79,33,27,98,66}, + {88,36,68,87,57,62,20,72,3,46,33,67,46,55,12,32,63,93,53,69}, + {4,42,16,73,38,25,39,11,24,94,72,18,8,46,29,32,40,62,76,36}, + {20,69,36,41,72,30,23,88,34,62,99,69,82,67,59,85,74,4,36,16}, + {20,73,35,29,78,31,90,1,74,31,49,71,48,86,81,16,23,57,5,54}, + {1,70,54,71,83,51,54,69,16,92,33,48,61,43,52,1,89,19,67,48}, + }; + unsigned m = 0; + unsigned i, j; + + for (i = 0; i < N-3; i++) { + for (j = 0; j < N-3; j++) { + unsigned h = grid[i][j] * grid[i][j+1] * grid[i][j+2] * grid[i][j+3]; + unsigned v = grid[j][i] * grid[j+1][i] * grid[j+2][i] * grid[j+3][i]; + unsigned d1 = grid[i][j] * grid[i+1][j+1] * grid[i+2][j+2] * grid[i+3][j+3]; + unsigned d2 = grid[i][N-j-1] * grid[i+1][N-j-2] * grid[i+2][N-j-3] * grid[i+3][N-j-4]; + m = max(m, max(h, max(v, max(d1, d2)))); + } + } + printf("%u\n", m); + + return 0; +} + +unsigned max(unsigned a, unsigned b) +{ + return a > b ? a : b; +} +
 @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2009, eagletmt + * Released under the MIT License + */ + +#include + +static unsigned divisor_count(unsigned long n); + +int main(void) +{ + unsigned long i = 1, n = 1; + + while (divisor_count(n) < 500) { + n += ++i; + } + printf("%lu\n", n); + return 0; +} + +unsigned divisor_count(unsigned long n) +{ + unsigned ret = 1; + unsigned long i; + + for (i = 2; i <= n; i++) { + unsigned c = 0; + while (n % i == 0) { + c++; + n /= i; + } + ret *= c+1; + } + return ret; +} +
 @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2009, eagletmt + * Released under the MIT License + */ + +#include +#include +#include + +#define N 100 + +int main(void) +{ + char digits[][N] = { + "37107287533902102798797998220837590246510135740250", + "46376937677490009712648124896970078050417018260538", + "74324986199524741059474233309513058123726617309629", + "91942213363574161572522430563301811072406154908250", + "23067588207539346171171980310421047513778063246676", + "89261670696623633820136378418383684178734361726757", + "28112879812849979408065481931592621691275889832738", + "44274228917432520321923589422876796487670272189318", + "47451445736001306439091167216856844588711603153276", + "70386486105843025439939619828917593665686757934951", + "62176457141856560629502157223196586755079324193331", + "64906352462741904929101432445813822663347944758178", + "92575867718337217661963751590579239728245598838407", + "58203565325359399008402633568948830189458628227828", + "80181199384826282014278194139940567587151170094390", + "35398664372827112653829987240784473053190104293586", + "86515506006295864861532075273371959191420517255829", + "71693888707715466499115593487603532921714970056938", + "54370070576826684624621495650076471787294438377604", + "53282654108756828443191190634694037855217779295145", + "36123272525000296071075082563815656710885258350721", + "45876576172410976447339110607218265236877223636045", + "17423706905851860660448207621209813287860733969412", + "81142660418086830619328460811191061556940512689692", + "51934325451728388641918047049293215058642563049483", + "62467221648435076201727918039944693004732956340691", + "15732444386908125794514089057706229429197107928209", + "55037687525678773091862540744969844508330393682126", + "18336384825330154686196124348767681297534375946515", + "80386287592878490201521685554828717201219257766954", + "78182833757993103614740356856449095527097864797581", + "16726320100436897842553539920931837441497806860984", + "48403098129077791799088218795327364475675590848030", + "87086987551392711854517078544161852424320693150332", + "59959406895756536782107074926966537676326235447210", + "69793950679652694742597709739166693763042633987085", + "41052684708299085211399427365734116182760315001271", + "65378607361501080857009149939512557028198746004375", + "35829035317434717326932123578154982629742552737307", + "94953759765105305946966067683156574377167401875275", + "88902802571733229619176668713819931811048770190271", + "25267680276078003013678680992525463401061632866526", + "36270218540497705585629946580636237993140746255962", + "24074486908231174977792365466257246923322810917141", + "91430288197103288597806669760892938638285025333403", + "34413065578016127815921815005561868836468420090470", + "23053081172816430487623791969842487255036638784583", + "11487696932154902810424020138335124462181441773470", + "63783299490636259666498587618221225225512486764533", + "67720186971698544312419572409913959008952310058822", + "95548255300263520781532296796249481641953868218774", + "76085327132285723110424803456124867697064507995236", + "37774242535411291684276865538926205024910326572967", + "23701913275725675285653248258265463092207058596522", + "29798860272258331913126375147341994889534765745501", + "18495701454879288984856827726077713721403798879715", + "38298203783031473527721580348144513491373226651381", + "34829543829199918180278916522431027392251122869539", + "40957953066405232632538044100059654939159879593635", + "29746152185502371307642255121183693803580388584903", + "41698116222072977186158236678424689157993532961922", + "62467957194401269043877107275048102390895523597457", + "23189706772547915061505504953922979530901129967519", + "86188088225875314529584099251203829009407770775672", + "11306739708304724483816533873502340845647058077308", + "82959174767140363198008187129011875491310547126581", + "97623331044818386269515456334926366572897563400500", + "42846280183517070527831839425882145521227251250327", + "55121603546981200581762165212827652751691296897789", + "32238195734329339946437501907836945765883352399886", + "75506164965184775180738168837861091527357929701337", + "62177842752192623401942399639168044983993173312731", + "32924185707147349566916674687634660915035914677504", + "99518671430235219628894890102423325116913619626622", + "73267460800591547471830798392868535206946944540724", + "76841822524674417161514036427982273348055556214818", + "97142617910342598647204516893989422179826088076852", + "87783646182799346313767754307809363333018982642090", + "10848802521674670883215120185883543223812876952786", + "71329612474782464538636993009049310363619763878039", + "62184073572399794223406235393808339651327408011116", + "66627891981488087797941876876144230030984490851411", + "60661826293682836764744779239180335110989069790714", + "85786944089552990653640447425576083659976645795096", + "66024396409905389607120198219976047599490197230297", + "64913982680032973156037120041377903785566085089252", + "16730939319872750275468906903707539413042652315011", + "94809377245048795150954100921645863754710598436791", + "78639167021187492431995700641917969777599028300699", + "15368713711936614952811305876380278410754449733078", + "40789923115535562561142322423255033685442488917353", + "44889911501440648020369068063960672322193204149535", + "41503128880339536053299340368006977710650566631954", + "81234880673210146739058568557934581403627822703280", + "82616570773948327592232845941706525094512325230608", + "22918802058777319719839450180888072429661980811197", + "77158542502016545090413245809786882778948721859617", + "72107838435069186155435662884062257473692284509516", + "20849603980134001723930671666823555245252804609722", + "53503534226472524250874054075591789781264330331690", + }; + + int i; + char *str; + mpz_t sum, t; + + mpz_init_set_ui(sum, 0); + mpz_init(t); + for (i = 0; i < N; i++) { + mpz_set_str(t, digits[i], 10); + mpz_add(sum, sum, t); + } + + str = mpz_get_str(NULL, 10, sum); + str[10] = 0; + puts(str); + + free(str); + mpz_clear(sum); + mpz_clear(t); + + return 0; +} +
 @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2009, eagletmt + * Released under the MIT License + */ + +#include + +static unsigned collatz_count(unsigned n); + +int main(void) +{ + unsigned i, max_c = 0, max_i = 0; + + for (i = 1; i < 1000000; i++) { + unsigned c = collatz_count(i); + if (c > max_c) { + max_c = c; + max_i = i; + } + } + printf("%u\n", max_i); + return 0; +} + +unsigned collatz_count(unsigned n) +{ + unsigned c = 0; + while (n > 1) { + n = n%2==0 ? n/2 : 3*n+1; + c++; + } + return c+1; +} +
 @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2009, eagletmt + * Released under the MIT License + */ + +#include +#include + +int main(void) +{ + mpz_t n, m; + + /* calculate 40C20 as 40! / (20! * 20!) */ + mpz_init(n); mpz_init(m); + mpz_fac_ui(n, 40); mpz_fac_ui(m, 20); + mpz_mul(m, m, m); + mpz_divexact(n, n, m); + + mpz_out_str(stdout, 10, n); + putchar('\n'); + + mpz_clear(n); + mpz_clear(m); + + return 0; +} +
 @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2009, eagletmt + * Released under the MIT License + */ + +#include +#include +#include + +int main(void) +{ + mpz_t n; + char *str; + size_t len, i; + unsigned sum = 0; + + mpz_init(n); + mpz_ui_pow_ui(n, 2, 1000); + + str = mpz_get_str(NULL, 10, n); + len = mpz_sizeinbase(n, 10); + for (i = 0; i < len; i++) { + sum += str[i]-'0'; + } + printf("%u\n", sum); + + free(str); + mpz_clear(n); + + return 0; +} +