C语言数组练习题删除法筛选质数

1608213870-1-1

数组删除法筛选质数

我写的筛选质数的思路是:
1.先生成2到NUM直接的全部整数(代码上面哪个注释写错了,没改过来)
2.第一层循环 从2循环到上一步生成的数组成员总数,自增变量为m。第二层循环是遍历从1到m,自增变量是n。
3.在第二次循环中如果arr[m]%arr[n]==0,那么arr[m]就是非质数,此时让flag=1来标记arr[m]。
4.判断flag的数值,如果是0,则表示arr[m]为质数,并进行输出

1608473374-e0949654ad79fee35046e3fd46e3b3c-1

/**
* File Name: zhishu.c
* Author: Haoxuan
* Mail: haovxuan@126.com
* Created Time: 2020年12月20日 星期日 18时49分55秒
**/
#include 
#define NUM 802
int main()
{
    int arr[NUM];
    int n;
    printf("xxxxx质数筛选xxxxxx\n");
    //生成从1到NUM的数组
    for(int i=2;i<NUM;i++)
        arr[i]=i;
    for(int m=2;m<sizeof(arr)/sizeof(arr[0]);m++)
    {
        if(arr[m]==1)
            continue;
        int flag=0;
        for(n=1;n<m;n++)
        {
            if(arr[m]%arr[n]==0){
                flag=1;
                break;
            }
        }
        if(flag==0)
            printf("%d ",arr[m]);
    }
    printf("\n");
    return 0;
}

我遇到了一个问题

当NUM>802的时候,报了错。如果小于等于802就没有这个问题。

报错:Floating point exception (core dumped)

1608473375-f381b4b32010ca3f8a200d82033b61d-1

关于这个问题老师给我的回复

这是因为在目前的机器环境上,按照我定义的数组的存储类型,存放数组的位置只能开销出这么大的空间,数组再大就会引起存储破裂,比如auto的数组放在栈上,栈上的空间是有上限值的,最多能够放一个802的整型数组这么大,再大就引起栈破裂了。

怎么去解决这个问题

这个程序在我的机器环境上跑有问题,换一台不一定就会有问题,至于解决的方法:宗旨是更改数组存放的位置,比如定义的时候用static,或者整个程序用动态内存管理的思路做。

或者用命令查看目前机器环境上每个进程的虚拟空间中目前默认的栈大小,再用相应的命令将栈空间改大。

要么换位置存,要么将当前所用的位置改大。

 

 

另外一种方法

1608541073-16085410331-1

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容