hnust 1101(水): 实验3-3:统计素数个数

来源:互联网 发布:mac口红代购 编辑:程序博客网 时间:2024/05/22 03:08

题目描述

 

从键盘输入一个整数n(98000<=n<=100000),统计1至n范围内素数的个数。

质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。换句话说,只有两个正因数(1和自己)的自然数即为素数。比1大但不是素数的数称为合数。1和0既非素数也非合数。

输入

输入一个整数n(98000<=n<=100000)

输出

素数的个数

样例输入

100000

样例输出

9592

提示

本题由教材例3-18改编而成


本题需要考虑对算法的优化,虽然题目给了2秒的执行时间,但如果你的算法设计不好,仍然可能会超时哟!超时的提示是:Time Limit Exceed,简称TLE


本题难度系数为5

来源

Derson



结题思路:

素数我不怎么会用,还有很多求素数的办法,各种优化,我觉得很难,有点看不懂,筛选法啊什么的我搞不清,看这个n这么大可能不能够暴力求解,一定会超时,看了人家博客的结题,自己又敲了一遍,算是借鉴。

#include <iostream>#include <algorithm>#include <cmath>#define true 1#define false 0const int maxn=100001;int shu[maxn];using namespace std;void is_getprime(int n){    int i,j;    shu[0]=shu[1]=true;    for(i=2;i<=sqrt(n);i++)//从2到根号n中,表示是否有素数,存在则是false,不存在是true;    {        if(!shu[i])//i为素数            for(j=i+i;j<=n;j+=i)//将编号为i的倍数的数均标记为非素数,因为存在公因数            shu[j]=true;    }}int main(){    int n;    while(cin>>n)    {        int i=0,l=0;        is_getprime(n);        for(i=2;i<=n;i++)            if(shu[i]==false)//调用函数之后,直接计算i到n之间的素数即可            l++;        cout<<l<<endl;    }    return 0;}