- 论坛徽章:
- 0
|
写了一个,测试了一下,算10^9耗时50+秒
这还是在比较高端的机器上跑的结果,真不知7秒是怎么出来的
- #include "stdafx.h"
- #define LEN (sizeof(char) * 8)
- #define GETBIT(buffer, offset, bit) ( buffer[offset] & ( 128 >> bit ) )
- #define SETBIT(buffer, n) ( buffer[n / LEN] |= ( 128 >> (n % LEN) ) )
- int GetPrime()
- {
- size_t MAX_NUM = 1e1;
- size_t BORDER = (size_t) sqrt( (double) MAX_NUM);
- size_t count = 0;
- //分配空间并置0,如果分配空间不成功则需加大虚拟内存
- char *buffer = new char [MAX_NUM / LEN + 1];
- if (buffer == NULL)
- {
- cerr << "new faile!" << endl;
- return 1;
- }
- memset(buffer, 0, MAX_NUM / LEN + 1);
- buffer[0] = (char) 128; //1不是素数,也不是合数
- size_t bit = 2, offset = 0;
- //筛法找素数
- for (size_t i = 2; i <= MAX_NUM; i++, bit++)
- {
- //每8位进一个单元格
- if ( bit == LEN )
- {
- offset++;
- bit = 0;
- }
-
- //找到一个素数
- if (!GETBIT(buffer, offset, bit))
- {
- count++;
-
- //所有能整除该素数的数全是合数
- for (size_t j = 2 * i; j <= MAX_NUM; j += i)
- {
- SETBIT(buffer, j);
- }
- DEBUG_COUT(cout << i << ", ");
- }
- }
- DEBUG_COUT(cout << "\b\b " << endl);
- cout << "total prime " << count << endl;
- //释放空间
- delete []buffer;
- return 0;
- };
- int main(int argc, char *argv[])
- {
- RUNTIME(GetPrime, ());
- return 0;
- }
复制代码 |
|