POJ

来源:互联网 发布:微信公众平台seo 编辑:程序博客网 时间:2024/05/29 11:14

给出一个数字n,求n所在得一个区间的长度,区间是最近的两个素数为边界;

那么n如果为素数的话,那么直接输出0;

先打表,因为用的是前10万个素数,所以在打表的时候,记录素数的个数;

以n点为中心向两边判定,一定要先判定再加减;

#include<iostream>#include<cstring>#include<cmath>#define ll long long#define MAXN 10000005#define maxn 100005using namespace std;bool isprime[MAXN];ll num = 0;void checkprime() {    memset(isprime, true, sizeof(isprime));    num++;//因为2也是素数    for(ll i = 2; num <= maxn; i++) {        if(isprime[i]) {            num++;//如果没有标记的话就是素数,标记个数            for(ll j=i+i; j <= MAXN; j+=i) {//以i为倍数的数都是偶数,都不是素数,全部筛除                isprime[j] = false;            }        }    }}int main () {    int n;    checkprime();    while(cin >> n && n) {        int ans = 1;        if(isprime[n]) puts("0");        else {            int l = n-1, r = n;//预处理向左            while(!isprime[l]) {//向左                l--;                ++ans;            }            while(!isprime[r]) {//向右                r++;                ++ans;            }            printf("%d\n", ans);        }    }    return 0;} 
原创粉丝点击