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变成了负数,同样进入循环,所以,你懂了。
####请采纳,回答不易~

what951006
小乌龟在大乌龟背上 回复SouthToNorth: 哈哈,谢谢
大约 2 年之前 回复
SouthToNorth
SouthToNorth 其实昨天已经知道问题出在哪了,但是一直找不到我提的这个问题,取消不了...不过还是采纳你了,谢谢。
大约 2 年之前 回复

大概是程序有数据段,一定范围内可以给你读取或写,一旦超出这个,数据不能给你读取,然后程序就崩溃了

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
【C语言】求素数和.c
#include&amp;lt;stdio.h&amp;gt;int main(){ int n,m,t; int x=2,count=1,sum1=0,sum2=0; scanf(&quot;%d %d&quot;,&amp;amp;n,&amp;amp;m); if(n&amp;gt;0&amp;amp;&amp;amp;n&amp;lt;=m&amp;amp;&amp;amp;m&amp;lt;=200){ while(count&amp;lt;=m) { int isprime=1; i
求救!数组长度过大,溢出
我在程序中用到10W个随机数,并且每个随机数都有一些附加信息,所以rn我用一个结构体数组存放,但是调试的时候出错:Unhandled exception in suijishu.exe:0xC00000FD:Stack Overflow。rn帮帮忙把。rn 是不是数组的长度过大,栈溢出啦?又怎么解决?
概率算法求素数(c语言)
概率算法求素数(c语言)
C语言求素数
#include#includeint fun(int lim,int aa[]){ int n, i, j,p=0; for (i = 2; i <= lim ; i++) { n = 0; for (j = 2; j <=i/2 ; j++)//注意此处为j<=i/2,不然若为2的倍数的数无法得出结果 { if (i%j == 0) n = 1; } if (n == 0)//说明是素数 {
C语言求素数的程序
一个用C语言求素数的小程序,分享出来大家看看有没有可以改进的地方
求素数算法(C语言)
以下是用C语言求一定范围内的素数。#include<stdio.h> #include<math.h> int imax(int,int); void main(void) { int m,k,i; for(m=101;m<200;m+=2){ k=(int)sqrt((double) m); for(i=2;i<=k;i++){
【C语言】求素数
求素数
求素数(C语言)
求100到200之间的素数 #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #include&lt;math.h&gt; int main() { int i = 0; for ( i = 101; i &lt; 200; i+=2) { int j = 0; int k = (int)sqrt(i); for (j = 2...
C 语言求素数
用C语言开发的求素数,适合初学者学习,参考价值比较大
c语言求素数的问题
用下面这个程序可以得出正确的结果:rn#include rn#include rnrnint main(void)rnrn int k;rn int n, i;rnrn printf("请输入您要求得的数:\n");rn scanf("%d",&n);rnrn k = sqrt(n + 1);rnrn for (i = 2; i <= k; i++)rn rn if (n%i == 0) break;rn rn if (i>=k+1) printf("%d 是一个素数!\n",n);rn else printf("%d 不是一个素数!\n",n);rnrn return 0;rnrnrn但是当k定义为double的时候,结果是错误的,比如输入17,就会显示不是素数,这是什么问题呢?rn
C语言 求素数、排序算法
一、素数 1.从2到n-1之间依次检查是否有n的因数 题目:判断一个数是否是素数bool Isprimer(int n) { for(int i=2;i<n;i++) { if(n % 2==0) { return false; } } return true; } int main() {
C语言 求素数的和。
c语言源代码 判断是否是素数 然后把素数相加..
C语言:求素数
任务代码: 求素数的基本方法: #include int main() { int i,m; int prime=1; printf("请输入一个数字:"); scanf("%d",&m); for(i=2;i<=m-1;i++) { if(m%i==0) { prime=0;
C语言——求素数和
素数和 题目内容: 我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推。 现在,给定两个整数n和m,0 输入格式: 两个整数,第一个表示n,第二个表示m。  输出格式: 一个整数,表示第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。  输入样例: 2 4  输出样例: 15 思路:先判断素数并计数,直到计数等于大于n小
c语言求素数
#include #include /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int main(int argc, char *argv[]) { int a,n,i,sushu=1; printf("请输入起始与结束的数:")
c语言| |如何求素数
首先解释一下啥叫做素数(素数也叫作质数)素数就是除了本身与1以外再没有其他因数求素数的几种方法1.从2到本身减1,看是否有没有可以整除的,如果有整除则不是素数#include&amp;lt;stdio.h&amp;gt; int main() { int num = 0; int i = 0; scanf(&quot;%d&quot;, &amp;amp;num); for (i = 2; i &amp;lt; num - 1; i++) ...
求素数的C语言代码优化
为了方便叙述,这里我们举一个例子。求100到200之间的素数。 方法一:判断一个数是否为素数我们首先想到的方法就是用这个数除以1到该数之间的每一个整数,如果都不能整除,那么该数为素数。例如求101是否为素数就让101除以2到100之间的数,都不能整除,所以101为素数。 可得代码:#include<stdio.h> int main() { int i=0; int j=0;
C语言求数组长度
我们很苦恼的是,C语言不像JAVA那样把所有的方法都给我们封装好了,我们可以直接拿来用。那么我们该如何求一个未满的数组的长度呢?下面给你一个方法: #include&amp;amp;amp;amp;amp;amp;lt;stdio.h&amp;amp;amp;amp;amp;amp;gt; int lengtha(int a[]){ int n=0; while(a[n]!='\0') n++; //'\0'=&amp;amp;amp;amp;amp;amp;gt;表示的是数组存放元素结束的标志 r
C语言数组长度极限
今天在做《计算机图学实验》大作业的时候,定义了一个数组用于存放顶点坐标,数组长度为1025*1025,可是总是弹出错误,最后经过上网查找,发现错误原因在于我的数组是在函数体内定义的。 函数体内定义的的数组存在于stack,函数体外的或者用static声明的数组存在于data,变量存储的内存空间不同,所以大小限制自然不同。我改为在函数体外定义,果然就正常运行了~
C语言——计算数组长度
C语言中,定义数组之后可以通过sizeof(a)/sizeof(a[0])的方法获得数组长度。 然而,当数组当作参数到子函数中,以上获取数组长度得到的结果永远是1. 因为,a是函数参数,到了本函数中,a只是一个指针(地址,系统在本函数运行时,是不知道a所表示的地址有多大的数据存储空间,这里只是告诉函数:一个数据存储空间首地址),所以,sizoef(a)的结果是指针变量a占内存的大小,一般在32...
C语言数组长度问题
为什么我取N=320的时候可以算,N=3200的时候就不出结果了,N=32000的时候提示十足长度太大,我是c的初学者,请专家指点,我用的编译器是TC2.0的 rn#include rn#include rn#define NUM 3200 rn#define N NUM+7 rn#define dx 2.0/NUM rn#define dt pow(dx,5.0/3.0) rn#define time 1.0 rnrnvoid pos_flux(double arr2[N]) rn rn int ii,jj; rn double ow[3]=0.1,0.6,0.3,array1[N]; rn for(ii=3;iilinfinite) rn linfinite=fabs(v2[j]-pow(sin(M_PI*((j-(N-1)/2)*dx-time)),9)); rn else linfinite=linfinite; rn rn printf("L-infinity-norm is %e,",linfinite); rn rnrnrnvoid main() rn rn int i,j; rn double u[N],u0[N],u1[N],u2[N],temp[N],mesh_ratio,t=0.0; rn for(j=3;jtime) mesh_ratio=(time-t)/(dx)+mesh_ratio; rn flux(temp); rn for(i=0;i
求素数 C语言 。C文件
详细解答 能运行 适合初学者 常考的一道题
C语言计算数组长度
看了很多人的经验,在这里简单的总结一下 字符串计算数组长度是strlen(),不要忘记#include&amp;lt;string.h&amp;gt; 和它不带最后一个null就没什么大问题。 sizeof()函数,用来计算()内的对象或者类型所占的内存字节数。用其来计算数组长度的方式很简单,一般用: int a[3] = {1,2,3} int length = sizeof(a)/sizeo...
C语言读取数组长度
sizeof读取数组的内存长度,然后除以第一个数据的内存长度就可以得到数组有几个,例子: #include int main(int argc, const char * argv[]) {     int a[] = {1, 5, 7, 9, 12, 15, 19};     int aCount = sizeof(a) / sizeof(a[0]);
C语言 求数组长度
C语言 数组长度
C语言求素数,以及优化
素数的C语言求法。
求素数的C语言版本程序
求素数的C语言版本 求素数的C语言版本 求素数的C语言版本
C语言求素数的两种方法
1,判断n是否能被2~n-1整除 输入的数n不能被2-(n-1)整除,说明是素数 输入的数n能被2-(n-1)整除,说明不是素数 注意:1不是素数,素数是指大于1的自然数,除了1和该数自身外,无法被其他自然数整除的数。 法一: #include&lt;stdio.h&gt; int main() { int i, n; printf("please input a nu...
【C语言训练】求素数问题
题目链接:http://115.28.203.224/problem.php?cid=1010&pid=19 题目描述 求出1-N中的所有素数 (1,N] 输入 多组数据,每组数据占一行,大于1的正整数N N 输出 1-N(1,N],左开右闭中的所有素数,(以从小到大的格式输出)(中间有空格,行末没有空格,每组数据输出占一行) 样例输入 95 样例输出 2 3 5 7 2 3
C语言求素数一个小问题
题目是要求n以内素数的平方根的和,编好了之后怎么运行答案都不对,加了这句选中的语句才对了,请问这句if(j>=k+1)有什么用?在上面一个for循环中j应该是到不了k+1的吧……求详解![图片](https://img-ask.csdn.net/upload/201508/08/1439048367_572189.png)
c语言求素数的小程序
c语言循环求素数,c语言经典面试题,面试必备宝典
C语言--使用函数求素数和
测试程序 #include &amp;amp;amp;lt;stdio.h&amp;amp;amp;gt; #include &amp;amp;amp;lt;math.h&amp;amp;amp;gt; int prime( int p ); int PrimeSum( int m, int n ); int main() { int m, n, p; scanf(&amp;amp;quot;%d %d&amp;amp;quot;, &amp;amp;amp;amp;m, &am
C语言获得数组长度的函数
1、c语言中,定义数组后可以用sizeof命令获得数组的长度(可容纳元素个数)。 例如: double a[] = {1,2,3,4}; int length; length=sizeof(a)/sizeof(a[0]); //数组占内存总空间,除以单个元素占内存空间大小 printf(“length of a=%d”, length ); //输出length of a=4 2、但...
C语言实现数组长度计算方法
写C时,经常要用到计算数组长度,我一般用下面这种方法: #define LEN(x) sizeof(x) / sizeof(x[0]) 即利用库函数sizeof来计算数组长度,这种方法,对一维数组和多维数组都有效,如以下代码示例: #include &quot;stdio.h&quot; #define LEN(x) sizeof(x) / sizeof(x[0]) int main(int argc,...
qtsort中的程序异常停止错误
调试中  Signal received  The inferior stopped because it received a signal from the Operating System.  Signal name : SIGSEGV  Signal meaning : Segmentation fault 这是错误说明程序中有空指针
c 求素数
int i, k, m;rn int leap = 0;rn int counter = 0;rnrn for(i = 2; i <= 100; i++)rn leap = 0;rn m = sqrt((float)i);rn for(k = 2; k <= m; k++)rn if(i % k == 0)rn leap = 1;rn if(leap == 0)rn rn counter += 1;rn //printf(" '%d ", counter);rn printf("%d ", i);rn rn if(counter % 5 == 0)rn printf("\n");rn rn //求100以内的素数,每5个元素换一行。但换行 不正确,中间有大块空白?怎么回事
C的数组长度
c语言中,定义数组后可以用sizeof命令获得数组的长度(可容纳元素个数) #include&amp;lt;stdio.h&amp;gt; int main(){ int a[] = {12,45,36,5,6}; int length = sizeof(a)/sizeof(a[0]); printf(&quot;%d\n&quot;,length); } length的实际上长度就是数组占内存总空间,除以单个元素占内...
C语言学习记录(2)求素数和
C语言学习记录 Mooc上的C语言练习: 素数和 题目内容: 我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推。 现在,给定两个整数n和m,0&amp;amp;amp;amp;amp;lt;n&amp;amp;amp;amp;amp;lt;=m&amp;amp;amp;amp;amp;lt;=200,你的程序要计算第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。 输入格式: 两个整数,第一个表示n,第二个表示m。 输出格式: 一个整数,表示第n个素数到第m个素数之间所有
三种用C语言求素数的方法 筛选法..
素数 1.筛选法求1-100内的素数#include&amp;lt;stdio.h&amp;gt;#include&amp;lt;stdlib.h&amp;gt;#include&amp;lt;assert.h&amp;gt;//#include&quot;stdafx.h&quot;void Prime(int n){ int*arr=(int*)malloc(n*sizeof(int)); for(int i=0;i&amp;lt;n;i++) {  arr[i]=1...
本例是一个求素数的c语言代码
烂资源部要了45555555555555555555555555555555555
相关热词 c++和c#哪个就业率高 c# 批量动态创建控件 c# 模块和程序集的区别 c# gmap 截图 c# 验证码图片生成类 c# 再次尝试 连接失败 c#开发编写规范 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数