首页 > 代码库 > UVa 1644 (筛素数 + 二分) Prime Gap

UVa 1644 (筛素数 + 二分) Prime Gap

题意:

给出一个整数n,如果n是素数输出0,否则输出它后一个素数与前一个素数的差值。

分析:

首先用筛法把前十万个素数都筛出来,然后放到数组里。用二分找到不大于n的最大的素数的下标,如果这个素数等于n,则直接输出0,否则输出它后一个素数与它本身的差值。

技术分享
 1 #include <cstdio> 2 #include <cmath> 3  4 const int maxn = 1299709; 5 const int maxp = 100000; 6 bool vis[maxn + 10]; 7 int prime[maxp + 10], cnt = 1; 8  9 void Init()10 {11     int m = sqrt(maxn + 0.5);12     for(int i = 2; i <= m; ++i) if(!vis[i])13         for(int j = i * i; j <= maxn; j += i)14             vis[j] = true;15     for(int i = 2; i <= maxn; ++i) if(!vis[i]) prime[cnt++] = i;16 }17 18 int main()19 {20     Init();21     int n;22     while(scanf("%d", &n) == 1 && n)23     {24         int L = 1, R = maxp;25         while(L < R)26         {27             int mid = L + (R - L + 1) / 2;28             if(prime[mid] <= n) L = mid;29             else R = mid - 1;30         }31         if(prime[L] == n) puts("0");32         else printf("%d\n", prime[L+1] - prime[L]);33     }34 35     return 0;36 }
代码君

 

UVa 1644 (筛素数 + 二分) Prime Gap