蓝桥杯 算法提高 找素数

题目如下:

问题描述
  给定区间[L, R] , 请计算区间中素数的个数。
输入格式
  两个数L和R。
输出格式
  一行,区间中素数的个数。
样例输入
2 11
样例输出
5
数据规模和约定
  2 <= L <= R <= 2147483647 R-L <= 1000000
---------分割线---------
  这题懂筛法的人看程序应该很容易。我自己当时有点思路但是不知道怎么下手,还是看别人的blog才懂的,首先从2到sqrt(R)中找素数,然后在L到R中筛出合数,具体看代码吧。
#include<stdio.h>
#include<math.h>
#define ll long long int
int t[1000001];
int vis[1000001];
int sum=0;
void f(ll a, ll b) 
{
    ll i,j;
    for(i=2;i*i<b;i++)
    {
        if(!vis[i]) 
        {
            for(j=2*i;j*j<b;j+=i) 
                vis[j]=1;
            for(j=(2>(a+i-1)/i?2:(a+i-1)/i)*i;j<b;j+=i)//这里看不懂的好好思索下,自己多调试调试就明白了
                t[j-a]=1;
        }
    }
}
int main()
{ 
    ll i,a,b;
    scanf("%I64d%I64d", &a, &b);
    f(a,b+1);
    for(i=a;i<=b;i++)
        if(!t[i-a]) 
            sum++;
    printf("%d
",sum);
    return 0;
}
原文地址:https://www.cnblogs.com/search-the-universe/p/last_month_1.html