项目欧拉#8

我试着自己解决这个问题,但一段时间后卡住了,所以看了解决方案。 问题#8 。
这就是我得到的。

#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; } 

我的问题:我不明白为什么这行中有-0′

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

对不起,如果我的问题非常愚蠢。 但我似乎无法弄明白。

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

基本上,它是将char转换为相应的数字。

解释是字符直接映射到ASCII值:

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

而值是顺序的。 因此,当您减去最低位数时,您将获得该位数后面的位置,该位数也将是数字的int值。

因为大块数字是一个字符串,所以每个字符都是数字的文本表示而不是数字本身。 如果我们采用例如i = 0j = 0 ,那么str[i+j]'7' ,注意引号。

现在,C中的字符通常用ASCII表示,其中每个字符用0到255之间'7'数字表示。转换为数字表示时, '7'等于55.请参见此处获取ASCII值表: http:/ /www.asciitable.com/ 。

注意,现在所有数字都是连续的。 '0'值为48,57减去48为7.从表示数字的字符中减去'0'是将其转换回数字的数字表示的一种方法。