素数打表

 

首先我们先来了解一下什么是素数:

素数(又称质数):

就是除了1和它本身,没有其他因子的整数

注:1既不是素数,也不是合数。

   其实判断一个数是不是素数也非常简单,zhi'直接看他有几个因子就行了,一个fou循环就结束了,那么如果我让你找出100以内的素数,你怎么找,你首先会想到的是,那还不简单吗?两个fou循环就够了,那么如果我让你求1e5以内的素数呢你在用两个fou循环时间都太长了吧。所以呢在这里我教你一种复杂度比较低的算法。

我们假如要求1—100的素数;

首先我们知道1不知素数,然后从2开始,2不是素数,试想一下,如果2是素数那么4,6,8,10还会不会是素数,其实2*i就都不是素数了,也就是说假如我们找到了一个素数,那么我们j就可以找到多个不是素数的数,把2*i都标记成不是素数,然后我们再找下一个素数3,那么6,9,12,15.....就都不是素数了,再找下一个素数5,那么10,15,20,25,30,35也都不是素数了,这样找素数是不是和你以前的算法复杂度降低了许多,下面我们用代码实现一下素数的打表,就打1e4前的素数吧!

#include<stdio.h>
#include<string.h>
const int maxn=1e4;
int a[maxn];
int main()
{
    for(int i=1;i<=maxn;i++)
        a[i]=1;             //先把所有的数都标记为是素数;
    a[0]=0;a[1]=0;//对一些特殊的数先提前处理;
    int cnt=0;//记录运行的次数
    for(int i=2;i<=maxn;i++)
    {
        if(a[i])             //如果这个数是素数,那么找那些和他相关联的非素数;
        {
            for(int j=i*i;j<=maxn;j+=i)
            {
                cnt++;
                a[j]=0;
            }
                                    //找到那些非素数并标记;
        }
    }
    printf("%d\n",cnt);
    for(int i=2;i<=maxn;i++)
    {
        if(a[i]) printf("%d ",i);
    }
    return 0;
}

如果我们用正常的方法,要运行1e8次,而这个代码只运行了16000多次,这是不是快了很多?

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值