7-2 求素数个数 (30分)
求素数的个数。本题要求编写一个程序,求1~n的素数个数。 要求至少给出两种解法,对于相同的n,给出这两种解法的结果,通过相关数据进行测试,目的是通过对比同一问题不同解法的绝对执行时间体会如何设计“好”的算法。
输入格式:
输入在一行中给出1个整数n(<= 10 000 000)。
输出格式:
对每一组输入,在一行中输出1~n的素数个数。
输入样例1:
5
输出样例1:
3
输入样例2:
14
输出样例2:
6
AC代码
#include <iostream>
#include <vector>
using namespace std;
int a[10000020]={0};
int main(int argc, char const *argv[])
{
int n,sum=0;
cin >> n;
int i,j;
for(i=2;i*i<=n;i++){
if(a[i]==0){
for(j=2*i;j<=n;j+=i){
if(a[j]!=1){
a[j]=1;
sum++;
}
}
}
}
/*for(i=2;i<=n;i++){
if(a[i]!=1){
sum++;
}
}*/
cout << n-sum-1 << endl;
return 0;
}
本来复制的之前写的一道,筛选法求素数
测试点6运行超时,又手动优化了一下╮(︶﹏︶)╭
时间限制只有200ms
就为了卡算法的呗
分割线
(改了一下
(可能比之前的好了一点点?
(好像还得赌命
(建议多提交几次
#include <iostream>
using namespace std;
int a[10000020]={0};
int b[10000020]={0};
int main(int argc, char const *argv[])
{
int n,sum=0,k=0;
cin >> n;
int i,j;
for(i=2;i<=n;i++){
if(!a[i]){
b[++k]=i;
}
for(j=1;j<=k && i*b[j]<=n;j++){
a[i*b[j]]=1;
sum++;
if(i%b[j]==0){
break;
}
}
}
cout << k << endl;
return 0;
}