[2016-03-07][UVALive][3883][Prime Gap]

[2016-03-07][UVALive][3883][Prime Gap]

  • 时间:2016-03-06 13:27:20 星期日
  • 题目编号:UVALive 3883 Prime Gap
  • 题目大意:
    • 给定1299709范围内的一个数字,求这个数字所在质数间隙的长度
      • 质数间隙:质数之间的距离,如果这个数字为数字,那么就输出0
  • 输入:若干行数字,以0结束
  • 输出:数字间隙的长度
  • 分析:直接埃氏筛法得到1299709范围内的质数表,得到里面的数字即可

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
typedef long long LL;
#define CLR(x,y) memset((x),(y),sizeof((x)))
#define FOR(x,y,z) for(int (x)=(y);(x)<(z);++(x))
#define FORD(x,y,z) for(int (x)=(y);(x)>=(z);--(x))
#define FOR2(x,y,z) for((x)=(y);(x)<(z);++(x))
#define FORD2(x,y,z) for((x)=(y);(x)>=(z);--(x))




const int MAXN = 1299709 + 10;
bool fg[MAXN];
int prime[100000+10];
void set_prime(){
          memset(prime,0, sizeof(prime));
          memset(fg,0, sizeof(fg));
           int np = 0;
           for ( int i = 2;i < MAXN; i++){
                    if (!fg[i]) 
                             prime[np++] = i;
                    for ( int j= 0; j < np && i*prime[j] < MAXN; j++){ 
                             fg[i * prime[j]] = 1;
                              if (i % prime[j] == 0) 
                                       break;
                   }
          }
}
int main(){
        //freopen("in.txt","r",stdin);
        //freopen("out.txt","w",stdout);
        set_prime();
        int n;
        while(~scanf("%d",&n) && n){
                int l = 0,r = 100000 + 10;
                while(r - l != 1){
                        int mid = (l + r) / 2;
                        if(prime[mid] > n)      r = mid;  
                        else l = mid;
                }
                int left = prime[l];
                int right = prime[l + 1];
                printf("%d\n",(n != prime[l]?right - left:0));               
        }
    return 0;
}  






来自为知笔记(Wiz)


posted on 2016-03-07 13:34  红洋  阅读(149)  评论(0)    收藏  举报

导航