//algorithm.h enum SWAP_TYPE{MEMORY, COMPLEX}; struct SIntArray { int *pData; int num; SIntArray():pData(NULL),num(0){} void Clear(){delete pData; pData = NULL; num = 0;} }; void Wswap(int &m, int &n, SWAP_TYPE name = MEMORY); int Wgcd(int m, int n); SIntArray Wprime(int m); //algorithm.cpp void Wswap(int &m, int &n, SWAP_TYPE name)//交换 { switch(name) { case MEMORY: m = m + n; n = m - n; m = m - n; break; case COMPLEX: int temp = m; m = n; n = temp; break; } } int GCD(int m, int n) { if( n == 0) { return m; } else { int r = m % n; GCD(n, r); } } int Wgcd(int m, int n)//寻找最大公约数 { if(m > n) { Wswap(m, n);//make sure m > n } int result = GCD(m, n); return result; } SIntArray Wprime(int m)//找所有小于m的质数 { SIntArray result; if(m <= 0) { return result; } int *number = new int [m+1]; for(int i = 0; i <= m; i++) { number[i] = i; } int limit = sqrt((float)m); for(int j = 2; j <= limit; j++) { if(number[j] != 0) { int temp = j*j;// j 2*j (j-1)*j 1:(j-1) have been processed, so only process j ... n/j
while(temp <= m) // eliminate { number[temp] = 0; temp = temp + j; } } } int count = 0; for(int j = 2; j <= m; j++) { if(number[j]) { number[count] = number[j]; count++; } } int *out = new int [count]; memcpy(out, number, count*sizeof(int)); delete number; number = NULL; result.pData = out; result.num = count; return result; }
//main.cpp int _tmain(int argc, _TCHAR* argv[]) { /* Wgcd 最大公约数 int m,n; cout<<"input two number:"<<endl; cin>>m>>n; cout<<"greatest common divisor:"<<endl; cout<<Wgcd(m, n)<<endl; */ int m; //小于n的所有质数 cout<<"input one number:"<<endl; cin>>m; cout<<"prime number:"<<endl; SIntArray result; result = Wprime(m); for(int i = 0; i <result.num; i++) { cout<<result.pData[i]<<" "; } result.Clear(); return 0; }