題目如下:
問題描述
給定區間[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\n",sum); return 0; }