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