[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; } |
浙公网安备 33010602011771号