1. 程式人生 > >弄了個歐拉篩求素數

弄了個歐拉篩求素數

nod ret edit blank 細節 lan log pri yun

最近遇到某方面的內容和歐拉篩有關系,於是就自己重新弄了個歐拉篩,當然記得以前自己曾經寫過一次,這次自己完全寫起來發現和第一次寫的主體方面還是差不多(就那麽一個細微的區別),可以參考一下 程序代碼:
#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;
} 原創文章:http://blog.163.com/huyunsong1314/

弄了個歐拉篩求素數