- //计算10亿需要60MB内存,比普通的bit位算法节省一半内存
- unsigned int PrimeCounter(unsigned int MaxNumber)
- {
- const unsigned MachineLength = sizeof(unsigned int) << 3;
- const unsigned int MaxSize = MaxNumber / (MachineLength<<1) + 1;
- unsigned int* Number = new unsigned int[MaxSize];
- memset(Number,0xFF,MaxSize*sizeof(unsigned int));
- for(unsigned long long num = 3;num<MaxNumber;num+=2)
- if(Number[num/(MachineLength<<1)] & (0x1L<<((num>>1) % MachineLength))) {
- for(unsigned long long NotPrime = num * num;NotPrime < MaxNumber ;NotPrime += num )
- if(NotPrime % 2)
- Number[NotPrime / (MachineLength<<1)] &= ~(0x1L << ((NotPrime>>1) % (MachineLength)));
- }
- unsigned int counter = 1;
- for(unsigned int num = 3;num < MaxNumber;num +=2)
- if( Number[num /(MachineLength<<1)] & (0x1L<<(num>>1 % (MachineLength)))){
- //cout << num << "/t";
- counter ++;
- }
- delete []Number;
- return counter;
- }
- int main()
- {
- clock_t pretime = clock();
- std::cout << "/nPrimeCounter(10000000)= "<<PrimeCounter(10000000) << std::endl;
- std::cout << clock() - pretime <<"ms has used.";
- std::cout <<std::endl;
- system("pause");
- return 0;
- }