Ubiquitouss 2021-04-22 19:02 采纳率: 50%
浏览 44
已采纳

段错误,哪里有越界访问呢?

 

//接收N,生成素数序列arr[2N],其中素数最大素数小于2N,
//for循环用公式计算d[2N],
//for循环判断d是否为2,并用sum统计
#include<cstdio>

int n=0;
int len=3;//arr长度
int sum=0;//素数对数目
int arr[10000]={0};

void primenum(int n,int arr[]);
int main(void)
{
    scanf("%d",&n);

    if(n<5) {
      printf("%d",0);
        return 0;
    }
    arr[0]=2;
    arr[1]=3;
    arr[2]=5;
    
    primenum(n, arr);
    
   // int d[len+100]={0};
    for(int i=0;arr[i+1]<n+1;i++){
      //  d[i]=arr[i+1]-arr[i];
     //   if(d[i]==2) sum++;
        if((arr[i+1]-arr[i])==2) sum++;
    }
    printf("%d", sum);
    
    return 0;
}

void primenum(int n, int arr[]){
    for(int i=6;i<2*n;i++){//从6开始生成素数
        bool flag= true;
        for(int j=0;j<len;j++){
            if(i % arr[j] ==0){
                flag=false;
                break;
            }
        }
        if(flag == true){
        	len++;
        	arr[len-1]=i;
    	}
	}
}

 

 

  • 写回答

4条回答 默认 最新

  • gecpyy 2021-04-22 20:39
    关注

    我拷贝了代码运行了一下,没问题啊,50000以内都没问题。

    楼主的arr数组太大了,不知道会不会是这个问题,我之前定义过大数组出现段错误。

    如果是因为数组太大,可以把arr改成int型指针,用malloc()分配内存空间。

    int *arr;//原int arr[10000]={0};

    arr = (int *)malloc(10000*sizeof(int));//include<string>给arr分配内存  

    memset(arr,0,10000*sizeof(int));//include<stdio.h>赋值0

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

报告相同问题?

悬赏问题

  • ¥15 请问一下这个运行结果是怎么来的
  • ¥15 这个复选框什么作用?
  • ¥15 单通道放大电路的工作原理
  • ¥30 YOLO检测微调结果p为1
  • ¥20 求快手直播间榜单匿名采集ID用户名简单能学会的
  • ¥15 DS18B20内部ADC模数转换器
  • ¥15 做个有关计算的小程序
  • ¥15 MPI读取tif文件无法正常给各进程分配路径
  • ¥15 如何用MATLAB实现以下三个公式(有相互嵌套)
  • ¥30 关于#算法#的问题:运用EViews第九版本进行一系列计量经济学的时间数列数据回归分析预测问题 求各位帮我解答一下