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