题目链接:http://ccpc.ahu.edu.cn:8000/OJ/Problem.aspx?id=7
题目描述:
Description
redraiment在家极度无聊,于是找了张纸开始统计素数的个数。
设函数f(n)返回从1->n之间素数的个数。
redraiment发现:
f(1) = 0
f(10) = 4
f(100) = 25
...
满足g(m) = 17 * m2 / 3 - 22 * m / 3 + 5 / 3
其中m为n的位数。
他很激动,是不是自己发现了素数分布的规律了!
请你设计一个程序,求出1->n范围内素数的个数,来验证redraiment是不是正确的,也许还可以得诺贝尔奖呢。^_^
Input
输入包括多组数据。
每组数据仅有一个整数n (1≤n≤10,000,000)。
输入以0结束
Output
对于每组数据输入,输出一行,为1->n(包括n)之间的素数的个数
Sample Input
Original | Transformed |
1
10
65
100
0
Sample Output
Original | Transformed |
0
4
18
25
题目分析:
详见代码;
AC代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=10000001;
int prim[665535],num;
bool v[maxn];
void Init()
{
v[1]=1;//v[i]=0表示是素数,是1表示不是素数
num=0;
for(int i=2;i<maxn;i++)
{
if(!v[i])
{
prim[++num]=i;//prim[i]记录第i素数的值
}
for(int j=1;j<=num&&prim[j]*i<maxn;j++)
{
v[i*prim[j]]=1;//所有素数的i倍肯定都不是素数
}
}
}
int main()
{
int n;
Init();
while(1)
{
scanf("%d",&n);
if(!n)
break;
int x=0;
for(int i=1;i<=n;i++)
{
if(!v[i])
x++;
}
printf("%d\n",x);
}
return 0;
}