【发布时间】:2014-05-27 22:33:51
【问题描述】:
我正在研究Eratostenes 查找素数方法的 c 实现,但我遇到了一个非常奇怪的错误。
int* criba(int n){
int *array;
int i,j,k,valor;
array = malloc(n*sizeof(int));
for (i=0;i<=n-2;i++){
array[i]=i+2;
}
for (j=0;j<n-2;j++){
valor = array[j];
for (k=1;valor*k+j<n-2;k++){
printf("%d \n",array[valor*k+j]);
}
}
}
return array;
}
这按预期工作,它创建了一个n-2 大小的数组,其中包含从 2 到 n 的所有数字,然后它检查每个值并在数组中打印其所有倍数(Eratostenes 的方法寻找一个从 2 开始的数字并在table 中标记,然后转到下一个未标记的数字,之后所有未标记的数字都是素数)
问题是,当我尝试将数字归零以“标记”它们时,我会无缘无故地陷入循环:
int* criba(int n){
int *array;
int i,j,k,valor;
array = malloc(n*sizeof(int));
for (i=0;i<=n-2;i++){
array[i]=i+2;
}
for (j=0;j<n-2;j++){
valor = array[j];
for (k=1;valor*k+j<n-2;k++){
if (array[valor*k+j] != 0){
printf("%d \n",array[valor*k+j]);
array[valor*k+j] = 0;
}
}
}
return array;
}
事实上,唯一的问题是array[valor*k+j] = 0;,如果我删除程序成功返回,但使用该行它会卡住,我找不到原因。非常感谢任何帮助。
【问题讨论】:
-
删除
array[valor*k+j] = 0;后重试