问题: 求解自然数n以内所有素数
埃拉托色尼筛选法:假设一个数是素数, 那么它的倍数不是素数。
因此,新建一个大小为n+1的bool类型数组prime,prime[i]为true,表示i为素数,否则为合数,先把全部奇数设为true,偶数设为false,在遍历每个奇数,将其奇数倍的数设为false。
#include <iostream>
#include <cmath>
#include <ctime>
using namespace std;
int main()
{
int n = 0, cnt = 1;
scanf("%d", &n);
bool *prime = new bool[n + 1];
clock_t start = clock();
for (int i = 2; i <= n; ++i)
{
prime[i] = i & 1 ? true : false;
}
clock_t finish1 = clock();
prime[2] = true;
printf("2 ");
for (int i = 3; i <= n; i += 2)
{
if (prime[i])
{
for (int j = i + i + i; j <= n ; j += i + i)
{
prime[j] = false;
}
cnt++;
cout << i;
cnt % 10 == 0 ? cout << endl : cout << " ";
}
}
clock_t finish2 = clock();
printf("\n运行时间:%d个CPU时钟\n",(finish2 - start));
printf("\n运行时间:%lf秒\n", static_cast<double>((finish2 - start) / CLOCKS_PER_SEC));//n较小(10000以内)无法正常显示时间
return 0;
}