求素数的个数。本题要求编写一个程序,求1~n的素数个数。 要求至少给出两种解法,对于相同的n,给出这两种解法的结果,通过相关数据进行测试,目的是通过对比同一问题不同解法的绝对执行时间体会如何设计“好”的算法。
输入格式:
输入在一行中给出1个整数n(<= 10 000 000)。
输出格式:
对每一组输入,在一行中输出1~n的素数个数。
输入样例1:
5
输出样例1:
3
输入样例2:
14
输出样例2:
6
#include<bits/stdc++.h>
using namespace std;
/*方案一不可解*/
/*
bool is_prime(int num)
{
if (num <= 3)
return num > 1;
if (num % 6 != 1 && num % 6 != 5)
return false;
int s = sqrt(num);
for (int i = 5; i <= s; i += 6)
if (num % i == 0 || num % (i + 2) == 0)
return false;
return true;
}
int main()
{
int ans=0;
int n;
cin>>n;
for(int i=0;i<n;i++)
ans+=is_prime(i);
cout<<ans;
}
*/
/*方案二:埃氏(朴素)筛法=筛去不是素数的倍数*/
/*
bool* a;
int main()
{
int num, res = 0;
cin >> num;
a = new bool[num + 1];
fill(a, a + num + 1, false);
for (int i = 2; i * i <= num; i++)
{
if (!a[i])
{
for (int j = i * i; j <= num; j += i)
a[j] = 1;
}
}
for (int i = 2; i <= num; i++)
{
if (a[i] == 0) res++;
}
printf("%d", res);
return 0;
}
*/
//方案三 欧拉筛法
bool* isprime;
vector<int> v;
void OL(vector<int>& v,int N)
{
for (int i = 2; i <= N; i++)
{
if (!isprime[i])v.push_back(i);
for (int j = 1; v[j] * i <= N; j++)
{
isprime[v[j] * i] = true;
if (i % v[j] == 0)break;
}
}
}
int main()
{
int N;
cin >> N;
isprime = new bool[N * 2];
fill(isprime, isprime + N + 1, false);
v.push_back(0);
OL(v, N);
cout << v.size() - 1;
return 0;
}