Proyecto Euler # 8

Traté de resolver el problema por mi cuenta pero me quedé atascado después de un rato, así que busqué la solución. Pregunta # 8 .
Y esto es lo que tengo.

#include  int main(void) { char str[] = "73167176531330624919225119674426574742355349194934" "96983520312774506326239578318016984801869478851843" "85861560789112949495459501737958331952853208805511" "12540698747158523863050715693290963295227443043557" "66896648950445244523161731856403098711121722383113" "62229893423380308135336276614282806444486645238749" "30358907296290491560440772390713810515859307960866" "70172427121883998797908792274921901699720888093776" "65727333001053367881220235421809751254540594752243" "52584907711670556013604839586446706324415722155397" "53697817977846174064955149290862569321978468622482" "83972241375657056057490261407972968652414535100474" "82166370484403199890008895243450658541227588666881" "16427171479924442928230863465674813919123162824586" "17866458359124566529476545682848912883142607690042" "24219022671055626321111109370544217506941658960408" "07198403850962455444362981230987879927244284909188" "84580156166097919133875499200524063689912560717606" "05886116467109405077541002256983155200055935729725" "71636269561882670428252483600823257530420752963450"; size_t len = sizeof str - 1; size_t i; unsigned max = 0; for (i = 0; i < len-4; i++) { unsigned p = 1; size_t j; for (j = 0; j  max) { max = p; } } printf("%u\n", max); return 0; } 

Mi problema: no entendí por qué había -‘0 ‘en esta línea

  p *= (unsigned)(str[i+j]-'0'); 

Lo siento si mi pregunta es muy estúpida. Pero parece que no puedo entenderlo.

 '0' - '0' == 0 '1' - '0' == 1 '2' - '0' == 2 etc. 

Básicamente, es para convertir un char a su dígito correspondiente.

Una explicación es que los caracteres se asignan directamente a los valores ASCII:

 '0' == 48 '1' == 49 '2' == 50 etc. 

Y los valores son secuenciales. Por lo tanto, cuando restas el dígito más bajo, obtienes la posición después de ese dígito, que también será el valor int del dígito.

Debido a que ese gran bloque de dígitos es una cadena, cada carácter es una representación de texto de un número en lugar del número mismo. Si tomamos, por ejemplo, el punto en el que i = 0 y j = 0 , entonces str[i+j] es '7' , tenga en cuenta las comillas.

Ahora, los caracteres en C normalmente se representan en ASCII, donde cada carácter está representado por un número del 0 al 255. '7' cuando se convierte a su representación numérica es igual a 55. Consulte aquí una tabla de valores ASCII: http: / /www.asciitable.com/ .

Tenga en cuenta, ahora que todos los números son secuenciales. El valor de '0' es 48 y 57 menos 48 es 7. Restar '0' de un carácter que representa un dígito es una forma de convertirlo nuevamente en la representación numérica del dígito.