无聊写了个Prime类,权当练习封装思想,其实就是个筛法制造素数表... get_table()本来想返回个指针的,但觉得为了保险,做了两个返回版本 #include <iostream> #include <cmath> #include <vector> using namespace std; class Prime{ private: bool *p_list; int size; int prime_num; void make(){ memset(p_list , sizeof(bool)*size , true); int sqrt_n=(int)(sqrt((double)size)+1.5); p_list[0]=p_list[1]=false; for(int i=2;i<sqrt_n;++i){ if(p_list[i]){ for(int j=i*i;j<size;j+=i) p_list[j]=false; } } } void CountPrime(){ prime_num=0; for(int i=0;i<size;++i) if(p_list[i]) prime_num++; } void size_check(int n){ if(n<2){ cout<<"illegal number!"<<endl; exit(1); } } void mem_check(bool *p){ if(p==NULL){ cout<<"memory error!"<<endl; exit(1); } } public: int get_num(){return prime_num;} Prime(int n=1000):size(n){ size_check(n); p_list=new bool[n]; mem_check(p_list); make(); CountPrime(); } void Resize(int n){ size_check(n); if(n<size){ bool *dest=new bool[n]; mem_check(dest); memcpy(dest , p_list , n*sizeof(bool)); bool *tmp=p_list; p_list=dest; delete []tmp; size=n; }else if(n>size){ delete []p_list; p_list=new bool[n]; mem_check(p_list); size=n; make(); } CountPrime(); } bool operator[](int n){ return *(p_list+n); } bool at(int n){ if(n>=0 && n<size) return *(p_list+n); else{ cout<<"illegal number"<<endl; exit(1); } } vector<int> get_vec_table(){ vector<int> p_table(prime_num); for(int i=0,j=0;i<size;++i) if(p_list[i]) p_table[j++]=i; return p_table; } int* get_ptr_table(){ int *p_table=new int[prime_num]; for(int i=0,j=0;i<size;++i) if(p_list[i]) p_table[j++]=i; return p_table; } virtual ~Prime(){ delete []p_list; } }; int main(){ const int size=100; Prime p(size); for(int i=0;i<size;++i){ if(p[i]) cout<<i<<" "; } cout<<endl; vector<int> prime=p.get_vec_table(); int *prime2=p.get_ptr_table(); cout<<prime.size()<<" "<<prime2[3]<<endl; delete []prime2; return 0; }