首页 > 其他 > 详细

素数个数

时间:2019-11-08 19:34:07      阅读:105      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

样例输入

4
2 11
2 98
2 1000000
999999000000 1000000

样例输出

6
25
78498
36400



直接上代码吧,注释很全了
#include <bits/stdc++.h>
#define ll long long
using namespace std;

const int N = 1e6 + 5;
ll n, m, pr[N], tot, s[N];
bool vis[N];

int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        scanf("%lld%lld", &n, &m);
        memset(vis, 0, sizeof vis);
        ll total = m + 1;//将n到n+m的数全认为是质数,也就是这个区间上数的个数总数 
        //区间里数的总数减去该区间所有合数,最终就是质数个数 
        //下面开始找合数 
        for (ll i = 2; i <= 1e6 && i <= n + m; i++)//从2到1e6枚举因数 
        //因数枚举的范围2-1e6,i<=n+m是一个小剪枝 
            for (ll j = (n / i) * i; j <= n + m; j += i)//(n/i)*i最接近n的i的倍数 
            //j是枚举n到n+m之间i的倍数,他有i这个因子,所以他就是合数了,标记为访问过,防止重复访问 
                if (j >= n && j != i && !vis[j - n]){
                    //j>=n就排除了(n/i)*i<n的情况 
                    //j != i是因为,当i=j时,不足以证明他是合数 
                    vis[j - n] = 1;//标记为访问过 
                    total--;//找到一个合数,减掉该合数 
                }
        printf("%lld\n", total);
    }
}

 

 

素数个数

原文:https://www.cnblogs.com/aprincess/p/11822201.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!