SouthToNorth 2017-08-13 12:26 采纳率: 100%
浏览 899
已采纳

C语言求素数 数组长度过大后 程序异常停止

做了一道输出第n(1≤n≤10000)个素数的算法题,采用的是素数筛法。但不是很明白为什么下面代码中mark[]的长度在40001还可以正常运行,改到50000、100000或以上就崩溃了。代码如下:

#include <stdio.h>
#include <stdbool.h>
int prime[10001]; // 保存筛得的素数
int primeSize; // 保存素数的个数
bool mark[40001]; // 若mark[x]为true,则表示该数x已被标记成非素数

void init() {
    for (int i = 1; i <= 40000; i++) {
        mark[i] = false;
    }
    primeSize = 0;
    for (int i = 2; i <= 40000; i++) {
        if (mark[i]) continue;
        prime[primeSize++] = i;
        for (int j = i * i; j <= 40000; j += i) { // i*i之前的已经被标记
            mark[j] = true;
        }
    }
    printf("%d\n", primeSize);
}

int main() {
    init();
    int n;
    while (scanf("%d", &n) != EOF) {
        printf("%d\n", prime[n - 1]);
    }
    return 0;
}

如果是开的数组太大了,那这段程序也可以运行啊。希望有人解答一下,谢谢!

 #include <stdio.h>
int a[1000000];
int main() {
    a[999999] = 3;
    printf("%d\n", a[999999]);
    return 0;
}

  • 写回答

2条回答

  • 关注
    void init() {
        for (int i = 1; i <= 40000; i++) {
            mark[i] = false;
        }
        primeSize = 0;
        for (int i = 2; i <= 40000; i++) {
            if (mark[i]) continue;
            prime[primeSize++] = i;
            for (int j = i * i; j <= 40000; j += i) { // i*i之前的已经被标记
                mark[j] = true;
            }
        }
        printf("%d\n", primeSize);
    }
    

    问题出在这里,并不在你说的内存溢出,请检查j的值,int j = i * i,当i>=46349,这里的j的值越界了,j变成了负数,同样进入循环,所以,你懂了。
    ####请采纳,回答不易~

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 Python爬取指定微博话题下的内容,保存为txt
  • ¥15 vue2登录调用后端接口如何实现
  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?