AOJ 7.Redraiment猜想

Redraiment猜想


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

1
10
65
100
0


Sample Output

0
4
18
25


思路:
这道题好,卡空间卡时间,还有掌握素数筛选的方法。

循环到 j < sqrt(MAX)+1/i 就好了

还有一个menset()的用法:
头文件是,string.h 参照样例,可以将所有bool数组化为true

/*
    Title: AOJ 7
    Date: 2016-9-24
    Author: pengwill
*/
#include<stdio.h>
#include<math.h>
#include<string.h>
#define MAX 10000000
bool a[MAX+1]={true};
int count[MAX+1]={0}; 
using namespace std;
int main()
{
    memset(a,true,sizeof(a));//初始化变量 
    int i=0,j=0,n=sqrt(MAX)+1;
    a[1] = false;
    a[2] = true;
    for(i=2;i<=n;i++)  //筛选循环
       for(j=2;j<=MAX/i;j++)
           a[j*i]=false;
    for(i = 1;i<=MAX;i++){//记录个数 
        count[i] = count[i-1] + a[i];
    } 
    int number;//输出数据 
    while(scanf("%d",&number)!=EOF &&number){
        printf("%d\n",count[number]);
    } 
    return 0;
}
posted @ 2016-09-24 21:40  pengwill  阅读(132)  评论(0编辑  收藏  举报