C素数崩溃于64901

标签 c function recursion

#include <stdio.h>
#include <stdlib.h>
#define size 20000000

int prim[size];
int  i, zahl, zaehler, erg;


int sieve(int zahl, int prim[], int zaehler) {
    if(zahl == 2000000)
        return 1;

    for(i=0; i<=zaehler; i++) {
        erg = zahl%prim[i];

        if(erg==0) {
            zahl++;
            return sieve(zahl, prim, zaehler);
        }   
    }           

    zaehler++;
    prim[zaehler]=zahl;
    zahl++;
    printf("%d\n", prim[zaehler]);
    return sieve(zahl, prim, zaehler);      
}

int main(){

    zaehler = 0;
    zahl = 2;       

    for(i=0;i<size;i++)
        prim[i]=2;

    sieve(zahl, prim, zaehler);
}

当我尝试计算素数时,当我运行这段代码时,它总是在数字 64901 处崩溃。 可能是什么问题?

最佳答案

讽刺的是,这实际上是由于递归导致的堆栈溢出。您可以使堆栈变大(这只会延迟问题),或从递归解决方案更改为迭代解决方案。

(无论如何,有些调试器在这种情况下无法为您提供帮助。对于 C 初学者来说,在第一次遇到这个问题之前很难理解出了什么问题。所以恭喜!您正在升级 C)

验证它确实是堆栈溢出的一种廉价方法是在递归函数中的堆栈上创建额外的内存,并查看它崩溃的数字是否从 64901 开始发生变化。我的猜测是,如果您输入 char dummy[ 2048]在那里,它会崩溃得更快。

关于C素数崩溃于64901,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47480413/

相关文章:

performance - 递归算法的运行时间

c++ - 通过递归使用中点位移算法

c# - 如何检查目录是否共享?

c - 从C中的函数获取返回值

C++ 无法从类型 bool(class) 转换为 bool

c - 从单链表的末尾迭代到开头而不反转它

c - 无法执行连接对象/岛程序

c - 在计算器程序中使用 ASCII 转换进行编程

检查字符串中的子字符串,并使字符串的字符大写(当在那里找到子字符串时

c++ - 二进制搜索算法 C++