#include #include #include #include #include "da.h" DA_DEF_STRUCT(char, str); DA_DEF_STRUCT(uint64_t, prods); void str_append(struct str *str, const char *cstr); uint8_t char_to_u8(char c); int main(int argc, const char **argv) { uint64_t res = 0; uint64_t i = 0, j = 0; uint64_t window_size = 13; struct str str = {NULL, 0, 1024}; struct prods prods = {0}; DA_CREATE(prods, sizeof(*prods.items)); str.items = calloc(str.cap, sizeof(*str.items)); str_append(&str, "73167176531330624919225119674426574742355349194934"); str_append(&str, "96983520312774506326239578318016984801869478851843"); str_append(&str, "85861560789112949495459501737958331952853208805511"); str_append(&str, "12540698747158523863050715693290963295227443043557"); str_append(&str, "66896648950445244523161731856403098711121722383113"); str_append(&str, "62229893423380308135336276614282806444486645238749"); str_append(&str, "30358907296290491560440772390713810515859307960866"); str_append(&str, "70172427121883998797908792274921901699720888093776"); str_append(&str, "65727333001053367881220235421809751254540594752243"); str_append(&str, "52584907711670556013604839586446706324415722155397"); str_append(&str, "53697817977846174064955149290862569321978468622482"); str_append(&str, "83972241375657056057490261407972968652414535100474"); str_append(&str, "82166370484403199890008895243450658541227588666881"); str_append(&str, "16427171479924442928230863465674813919123162824586"); str_append(&str, "17866458359124566529476545682848912883142607690042"); str_append(&str, "24219022671055626321111109370544217506941658960408"); str_append(&str, "07198403850962455444362981230987879927244284909188"); str_append(&str, "84580156166097919133875499200524063689912560717606"); str_append(&str, "05886116467109405077541002256983155200055935729725"); str_append(&str, "71636269561882670428252483600823257530420752963450"); for ( i = 0; i < str.size - window_size; ++i ) { uint64_t t = 1; for ( j = 0; j < window_size; ++j ) { t *= (uint64_t) char_to_u8(*(str.items + i + j)); } DA_APPEND(prods, t); } for ( i = 0; i < prods.size; ++i ) { if ( prods.items[i] > res ) { res = prods.items[i]; } } printf("Result = %ld!\n", res); free(str.items); free(prods.items); (void) argc; (void) argv; return 0; } void str_append(struct str *str, const char *cstr) { uint64_t cstr_lenght = strlen(cstr); if ( (str->size + cstr_lenght) >= str->cap ) { str->cap *= 2; str->items = realloc(str->items, str->cap); } while ( *cstr != '\0' ) { str->items[str->size++] = *cstr; ++cstr; } } uint8_t char_to_u8(char c) { return (uint8_t)(c - '0'); }