藍橋杯 算法提高 找素數


題目如下:

問題描述
  給定區間[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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM