我正在用C ++运行这个程序来查找10000以下所有友好数字的总和。是的,这是我Project Euler question 21的程序。我已经知道算法不是最有效的算法,我发布这个算法的原因与程序的效率无关。
代码:
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
int sum = 0;
int d[10000];
for (int i = 0; i <= 9999; i++)
d[i] = 0;
for (int i = 1; i <= 9999; i++)
for (int j = 1; j < i; j++)
if (i%j == 0)
d[i] += j;
for (int i = 1; i <= 9999; i++)
if (d[d[i]] == i)
sum += i;
cout << sum/2;
}
错误似乎发生在最后一个for
循环中 - 我对它进行了评论并且一切正常(当然,除了明显错误的结果为0)。我得到的错误信息是
接着是:
----jGRASP exec: C:\Users\Sam\Documents\Project Euler\problem.exe
----jGRASP wedge2: exit code for process is -1073741819.
----jGRASP: operation complete.
现在,对于一个显而易见的问题 - 为什么会发生这种错误?
答案 0 :(得分:2)
这一行
if ( d[d[i]] == i)
由于d
可能大于d[i]
,将超出有效的索引范围9999
。
将其更改为:
if ( d[i] <= 9999 && d[d[i]] == i)
答案 1 :(得分:0)
如果d [i]的值大于10000,则d [d [i]]将是您已分配的10000个整数之外的参考。这会导致错误。