题目如下:
问题描述
给定区间[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; }