0008.c 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include "da.h"
  6. DA_DEF_STRUCT(char, str);
  7. DA_DEF_STRUCT(uint64_t, prods);
  8. void str_append(struct str *str, const char *cstr);
  9. uint8_t char_to_u8(char c);
  10. int
  11. main(int argc, const char **argv)
  12. {
  13. uint64_t res = 0;
  14. uint64_t i = 0, j = 0;
  15. uint64_t window_size = 13;
  16. struct str str = {NULL, 0, 1024};
  17. struct prods prods = {0};
  18. DA_CREATE(prods, sizeof(*prods.items));
  19. str.items = calloc(str.cap, sizeof(*str.items));
  20. str_append(&str, "73167176531330624919225119674426574742355349194934");
  21. str_append(&str, "96983520312774506326239578318016984801869478851843");
  22. str_append(&str, "85861560789112949495459501737958331952853208805511");
  23. str_append(&str, "12540698747158523863050715693290963295227443043557");
  24. str_append(&str, "66896648950445244523161731856403098711121722383113");
  25. str_append(&str, "62229893423380308135336276614282806444486645238749");
  26. str_append(&str, "30358907296290491560440772390713810515859307960866");
  27. str_append(&str, "70172427121883998797908792274921901699720888093776");
  28. str_append(&str, "65727333001053367881220235421809751254540594752243");
  29. str_append(&str, "52584907711670556013604839586446706324415722155397");
  30. str_append(&str, "53697817977846174064955149290862569321978468622482");
  31. str_append(&str, "83972241375657056057490261407972968652414535100474");
  32. str_append(&str, "82166370484403199890008895243450658541227588666881");
  33. str_append(&str, "16427171479924442928230863465674813919123162824586");
  34. str_append(&str, "17866458359124566529476545682848912883142607690042");
  35. str_append(&str, "24219022671055626321111109370544217506941658960408");
  36. str_append(&str, "07198403850962455444362981230987879927244284909188");
  37. str_append(&str, "84580156166097919133875499200524063689912560717606");
  38. str_append(&str, "05886116467109405077541002256983155200055935729725");
  39. str_append(&str, "71636269561882670428252483600823257530420752963450");
  40. for ( i = 0; i < str.size - window_size; ++i ) {
  41. uint64_t t = 1;
  42. for ( j = 0; j < window_size; ++j ) {
  43. t *= (uint64_t) char_to_u8(*(str.items + i + j));
  44. }
  45. DA_APPEND(prods, t);
  46. }
  47. for ( i = 0; i < prods.size; ++i ) {
  48. if ( prods.items[i] > res ) {
  49. res = prods.items[i];
  50. }
  51. }
  52. printf("Result = %ld!\n", res);
  53. free(str.items);
  54. free(prods.items);
  55. (void) argc; (void) argv;
  56. return 0;
  57. }
  58. void
  59. str_append(struct str *str, const char *cstr)
  60. {
  61. uint64_t cstr_lenght = strlen(cstr);
  62. if ( (str->size + cstr_lenght) >= str->cap ) {
  63. str->cap *= 2;
  64. str->items = realloc(str->items, str->cap);
  65. }
  66. while ( *cstr != '\0' ) {
  67. str->items[str->size++] = *cstr;
  68. ++cstr;
  69. }
  70. }
  71. uint8_t
  72. char_to_u8(char c)
  73. {
  74. return (uint8_t)(c - '0');
  75. }