题目描述
nowcoder在家极度无聊,于是找了张纸开始统计素数的个数。
设函数f(n)返回从1-n之间素数的个数。
nowcoder 发现:
f(1) = 0
f(10) = 4
f(100) = 25
…
满足g(m) = 17 * m^2 / 3 - 22 * m / 3 + 5 / 3
其中m为n的位数。
他很激动,是不是自己发现了素数分布的规律了!
请你设计一个程序,求出f(n),来验证nowcoder是不是正确的,也许还可以得诺贝尔奖呢。^_^
输入描述:
输入包括多组数据。
每组数据仅有一个整数n (1≤n≤10000000)。
输出描述:
对于每组数据输入,输出一行,为1->n(包括n)之间的素数的个数。
输入例子:
1
10
65
100
0
输出例子:
0
4
18
25
#include <iostream>
#include <cmath>
using namespace std;
bool isPrimer(int n){
if (n < 2)
return false;
int uper = sqrt(n);
for (int i = 2; i <= uper; i++){
if (n % i == 0)
return false;
}
return true;
}
int main(){
int n;
const int max_n = 10000000;
bool *a = new bool[max_n](); //利用了vs编译器的技巧,素数默认为0,非素数要改变为1
a[0] = true;
a[1] = true; //非素数
for (int i = 2; i <= max_n; i++){
if (a[i] == 0){
for (int j = 2 * i; j <= max_n; j += i){
a[j] = true;
}
}
}
while (scanf("%d", &n) != EOF){
if (n < 1){
break;
}
int counter = 0;
for (int i = 0; i <= n; i++){
if (!a[i]){
counter++;
}
}
printf("%d\n", counter);
}
}