弄了个欧拉筛求素数

Posted 5aafa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了弄了个欧拉筛求素数相关的知识,希望对你有一定的参考价值。

最近遇到某方面的内容和欧拉筛有关系,于是就自己重新弄了个欧拉筛,当然记得以前自己曾经写过一次,这次自己完全写起来发现和第一次写的主体方面还是差不多(就那么一个细微的区别),可以参考一下
程序代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>

void nodeMal( void** ,size_t );
void nodeFree( void** );
void nodeRea( void** ,size_t );

void fun ( char**,size_t**,size_t );
void print( const size_t* );

int main( void )
{
    char* isPrime=NULL;
    size_t* prime=NULL;

    fun(&isPrime,&prime,101);
    print(prime);
    
    nodeFree(( void** )&isPrime);
    nodeFree(( void** )&prime);
    
    return 0;
}

void nodeMal( void** p,size_t size )
{
    assert(p);
    
    *p=malloc(size);
    
    assert(*p);

    memset(*p,0,size);
}

void nodeRea( void** p,size_t size )
{
    void* p_new=NULL;
    
    assert(p);
    
    p_new=realloc(*p,size);
    
    assert(p_new);
 
     *p=p_new;
}

void nodeFree( void** p )
{
    assert(p);
    
    free(*p);
    *p=NULL;
}

void fun ( char** _isPrime,size_t** _prime,size_t len )
{
    
    char* isPrime=NULL;
    size_t* prime=NULL;
    
    size_t i;
    
    if (len<3)
        return ;
    
    nodeMal(( void** )_isPrime,sizeof (isPrime)*len);
    nodeMal(( void** )_prime,sizeof (isPrime)*len);
    
    isPrime=*_isPrime;
    prime=*_prime;
    
    for (i=0;i!=len;++i)
        isPrime[i]=0;  //测试手机运调用memset后可能还有少量内存块没有清零,所以这里重新赋值保险一点
        
    prime[0]=0;
    
    for (i=2;i!=len;++i)
    {
        size_t j;

        if (isPrime[i]==0)
            prime[++prime[0]]=i;
       
        for (j=1;prime[j]<=len/i;++j)
        {
            isPrime[i*prime[j]]=1;
            
            if (i%prime[j]==0)
                break;
        }
    }

    nodeRea(( void** )_prime,sizeof ( size_t )*((*_prime)[0]+1));
    
}

void print( const size_t* prime )
{
    size_t i;
    if (prime==NULL)
        return ;

    for (i=1;i!=prime[0]+1;++i)
        printf("%-6u",( unsigned )prime[i]);
        
    puts("");
}



PS:如果需要简单版参考的可以看看这个我第一次弄的(的确除了那个细节地方差不多一个样)技术分享图片~

技术分享图片程序代码:

#include<stdio.h>

#define MAX 100
char IsPrime[MAX+1]={0};
int prim[MAX+1]={0};

int main()
{
    int i=0;
    int j=0;
    int num=0;

    for (i=2;i<=MAX;++i)
    {
        if (!IsPrime[i])
            prim[num++]=i;

        for (j=0;j<num&&i*prim[j]<=MAX;++j)
        {
            IsPrime[i*prim[j]]=1;

            if (i%prim[j]==0)
                break;
        }
    }

    for (i=0;i<num;++i)
        printf("%-4d",prim[i]);

    puts("");

    return 0;
}




















































































































































以上是关于弄了个欧拉筛求素数的主要内容,如果未能解决你的问题,请参考以下文章

模板线性筛求素数

素数筛

欧拉筛法求素数

欧拉筛素数+求欧拉函数

欧拉函数o(n)求素数

初等数论-Base-1(筛法求素数,欧拉函数,欧几里得算法)