质数数量

本人出师牛,发题解有一点小激动。
这题的主要问题是——超时!!!
解决方法为——递推!!!
和其他题目一样,我们先来找规律。

//我们知道不大于0的质数有0个,所以:
f[0]=0;
if(用f[n]来表示不大于n的质数个数&&n>0){
    f[1]=0;
    f[2]=1;
    f[3]=2;
    f[4]=2;
    f[5]=3;
    f[6]=3;
    f[7]=4;
    ...
}
//我们会发现:
//如果n不是质数,不大于n的质数数量就等于不大于n-1的质数数量,
//反之,不仅要算不大于n-1的质数数量,还要算上自己。
//所以:
if(n>0){
    if(n是质数) f[n]=f[n-1]+1;
    else f[n]=f[n-1];
}

是不是有一点思路了呀?
所以,我们只要按这个规律把所有的数据算出来,然后直接输出就可以了(注意不是打表!)。
代码如下:

#include<iostream>
#include<cmath>
using namespace std;
int f[1000001];//用于存储答案
bool Prime(int n){//判断质数
    int i;
    if(n>1){
        for(i=2;i<=floor(sqrt(n));i++) if(n%i==0) return false;
        return true;
    }
    return false;
}
int main(){
    int i,t,n;
    f[0]=0;
    f[1]=0;
    cin>>t;
    for(i=2;i<=1000000;i++) f[i]=Prime(i)==true? f[i-1]+1:f[i-1];//算出所有的答案(递推核心)
    for(i=1;i<=t;i++){
        cin>>n;
        cout<<f[n]<<endl;//直接输出
    }
    return 0;
}

感觉像上了一节课,请问我讲明白了吗?

if(我讲明白了) 点赞;
else 在评论区问我;
全部评论
#include <iostream> using namespace std; const int x = 1000001;//使用const是因为能用在下面数组 int a[x];//存答案 bool is_prime[x];//数组内表示是不是质数,是质数为1(真)不是则为0(假) int main() {     for(int i = 0;i < x;i++)         is_prime[i] = true;//先把is_prime数组内的值都设为1(真)再使用埃式筛筛出不是质数的数变为0(假)     is_prime[0] = is_prime[1] = false;//0,1不是质数     for(int i = 2;i < x;i++)//埃式筛开始     {         if(is_prime[i])//是质数为真if语句触发         {             for(int j = 2 * i;j < x;j += i)             {                 is_prime[j] = false;//筛出不是质数的数都变为0(假)             }         }     }//埃式筛完结     for(int i = 2;i < x;i++)     {         if(is_prime[i])//是质数为真if语句触发             a[i] = a[i - 1] + 1;//统计质数个数方便下面输出         else//表示不是质数             a[i] = a[i - 1];//不是质数质数个数不变     }     int T,n;//题目所给变量     cin >> T;     while(T--)//T--表示个数越来越少直到为0(假)while循环不触发     {         cin >> n;         cout << a[n] << endl;//输出答案     }     return 0; }
点赞 回复
分享
发布于 2023-08-01 19:23 山东

相关推荐

14 7 评论
分享
牛客网
牛客企业服务