所以我一直在尝试用C语言实现Project Euler,因为我是一个受虐狂,但它实际上一直很顺利,直到problem 8:
int problem_8 () {
int max = 0;
const char* nums[] = {"73167176531330624919225119674426574742355349194934"
"96983520312774506326239578318016984801869478851843"
"85861560789112949495459501737958331952853208805511"
"12540698747158523863050715693290963295227443043557"
"66896648950445244523161731856403098711121722383113"
"62229893423380308135336276614282806444486645238749"
"30358907296290491560440772390713810515859307960866"
"70172427121883998797908792274921901699720888093776"
"65727333001053367881220235421809751254540594752243"
"52584907711670556013604839586446706324415722155397"
"53697817977846174064955149290862569321978468622482"
"83972241375657056057490261407972968652414535100474"
"82166370484403199890008895243450658541227588666881"
"16427171479924442928230863465674813919123162824586"
"17866458359124566529476545682848912883142607690042"
"24219022671055626321111109370544217506941658960408"
"07198403850962455444362981230987879927244284909188"
"84580156166097919133875499200524063689912560717606"
"05886116467109405077541002256983155200055935729725"
"71636269561882670428252483600823257530420752963450"};
for (int i = 0; i < 996; i++) {
int k = 1;
for (int j = 0; j < 5; j++) {
k *= atoi(nums[i+j]);
}
if (k > max)
max = k;
}
return max;
}
当我拨打problem_8()
时,此程序会立即崩溃。谷歌表示我应该在堆上动态创建数组而不是使用堆栈,但我一直无法确定如何完成这项工作,因为我从未真正进入动态内存分配(我来自Java背景) )。我只是使用malloc()为数组分配一千字节的内存吗?我该如何做到这一点?
编辑:事实证明 const char* nums[]
应该是const char nums[]
而不是atoi(nums[i+j])
我应该使用nums[i+j]-'0'
代替,它现在工作正常。忽略所有告诉我向数组添加逗号的答案。
答案 0 :(得分:4)
我没有阅读问题的要求;如果它应该是一个长字符串,那么nums
的类型是错误的。它应该是char
:
const char nums[] = "...
指针数组到char
:
const char *nums[] = "...
^
|
has meaning!
答案 1 :(得分:2)
这与堆栈溢出无关。
崩溃是因为您正在访问nums
中不存在的条目。
更准确地说,nums
是一个包含一个字符串nums[0]
的字符串数组。
使用const char* nums =
修复此问题。
您还需要将atoi
来电更改为nums[i+j]-'0'
。
答案 2 :(得分:1)
固定版本看起来像这样
...
for (int i = 0; i < 996; i++) {
int k = 1;
for (int j = 0; j < 5; j++) {
k *= nums[i+j]-'0';
}
if (k > max)
max = k;
}
...
它找到的最大值是40824。
答案 3 :(得分:-2)
不,这不是 Stack Overflow 而是逻辑错误,请尝试添加逗号。