【问题标题】:Clueless: Infinite Loop in C无能:C 中的无限循环
【发布时间】: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;后重试

标签: c arrays loops infinite


【解决方案1】:

显然在某个时刻valor = array[j]; 将使valor 等于0,因此循环valor*k+j &lt; n-2; 中的条件将始终为真,因此无限循环。

【讨论】:

  • 我现在觉得好傻。什么可能是一个不错的解决方案,一个重复的数组?
  • @user3502583 早期检查零性怎么样?
  • 哈哈哈是的,我只是这样做了,"if (valor !=0){" 在for循环修复一切之前,感谢大家^^
【解决方案2】:

由于valor = array[j]array[valor*k+j] = 0 的组合,您将永远循环;内部循环将一些后来的条目归零。然后在外循环的未来迭代中,array[j] 已经被归零,所以 valor = 0,所以内循环测试是(0 * k) + j &lt; n-2,其中 j 保持不变,始终为假。

最简单的解决方案是执行一次打印结果,然后单独执行一次循环并清零。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-22
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多