周中训练笔记+筛素数

来源:互联网 发布:sqlserver 行为日志 编辑:程序博客网 时间:2024/06/18 02:09
/*哇,博客用了这么久,花了老长时间整理了下博客,才发现原来他有自带的代码格式(倒数第四个按钮。。。)
因为之前为了比赛简单的看过些数论的题目,所以这次先看着数论,博客从最简单的开始。
各大oj好像都停了,没法水几个题了,数论印象最深的就是筛素数这一块,突然想起来没具体发过,简单的提过,PrimeGap里用到过,总结一次吧。
第一种筛法较慢一些,O(nlog(n)),具体就是没选出一个新素数,便将其倍数全部剔除,很简洁

第二种,O(n),利用了每一个合数至少有一个最小质因子代码标注,枚举,每次出现新素数之后,枚举不大于这个数的最小质因子的指数,将他们的乘积剔除,*/


#include<iostream>#include<stdio.h>#include<string.h>using namespace std;#define N 100005int prime[N],vis[N];void Aila(int n){    int k=1;    for(int i=2;i<n;i++)    {        if(!vis[i])        {            prime[k++]=i;            for(int j=2*i;j<n;j+=i)            {                vis[j]=1;            }        }    }}void Oula(int n){    int k=1;    for(int i=2;i<n;i++)    {        if(!vis[i])            prime[k++]=i;        for(int j=1;j<k&&i*prime[j]<n;j++)        {            vis[i*prime[j]]=1;            if(i%prime[j]==0)//具体在这里            break;        }    }}int main(){    Aila(1000);    for(int i=1;i<30;i++)        cout<<prime[i]<<" ";    memset(vis,0,sizeof(vis));    cout<<endl;    memset(prime,0,sizeof(prime));    Oula(1000);    for(int i=1;i<30;i++)        cout<<prime[i]<<" ";    return 0;}


原创粉丝点击