|
- #include <bitset>
- #include <iostream>
- #include <ios>
- #include <vector>
- #include <algorithm>
- using std::bitset;
- using std::vector;
- bitset<100000000> buf;
- vector<int> prime_table;
- void init();
- int main(int argc, char **argv)
- {
- init();
- std::cout << prime_table.size() << " prime number cached, the max one is "
- << prime_table.back() << "\n";
-
- int required;
- std::cout << "Max value?" << "\n";
- std::cin >> required;
-
- if(required <= 100000000){
- vector<int>::iterator iter, up =
- std::upper_bound(prime_table.begin(), prime_table.end(), required);
- for(iter=prime_table.begin(); iter!=up; ++iter)
- std::cout << *iter << " ";
- }
- else
- std::cout << "Too big for a regular PC! Maybe next version!\n";
-
- return 0;
- }
- void init()
- {
- std::ios_base::sync_with_stdio(false);
-
- buf[0] = buf[1] = 1;
- int i = 2;
- for(i=2; i<10000; ++i)
- if(buf[i] == 0){
- prime_table.push_back(i);
- buf[i] = 1;
- for(int j=i*i; j<100000000; j+=i)
- buf[j] = 1;
- }
- for(i=9999; i<100000000; i+=2)
- if(buf[i] == 0)
- prime_table.push_back(i);
- }
复制代码
很久之前提到的筛法代码
因为用的是bitset,编译要加-O2,不然印象中要10s以上的才能计算出一亿之内的质数
另外不要用endl,这东西的含义是换行且刷新控制台,速度很慢的
如果只是要换行应该std::cout << "\n";就可以了 |
|