2013 - ECJTU 暑期12级训练赛第一场-problem-B

B -B

Crawling in process...Crawling failedTime Limit:5000MS    Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

Description

The sequence of n − 1 consecutive composite numbers (positive integers that are not prime and not equal to 1) lying between two successive prime numbersp and p + n is called a prime gap of length n

For example, ‹24, 25, 26, 27, 28› between 23 and 29 is a prime gap of length 6.

Your mission is to write a program to calculate, for a given positive integerk, the length of the prime gap that contains k.

 For convenience, the length is considered 0 in case no prime gap containsk.

Input

The input is a sequence of lines each of which contains a single positive integer. 

Each positive integer is greater than 1 and less than or equal to the 100000th prime number, which is 1299709. 

The end of the input is indicated by a line containing a single zero.

Output

The output should be composed of lines each of which contains a single non-negative integer. 

It is the length of the prime gap that contains the corresponding positive integer in the input if it is a composite number, or 0 otherwise.

 No other characters should occur in the output.

Sample Input

10
11
27
2
492170
0

Sample Output

4
0
6
0
114

这道题就是一道数论的水题,先判断输入的n是否为素数,如果是素数的话,直接输出0,如果不是素数的话找到两个连续的素数,分别大于n和小于n输出这两个素数的差就可以了,当然你也可以构造素数表。

AC代码:

#include<iostream>
#include<cstring>
#include<algorithm>
const int MAX=1299710;
__int32 prime[MAX];
__int32 s[MAX];
__int32 number;
using namespace std;
int main()
{
__int32 i,j,n,k;
for(i=2;i<MAX;++i)
{
s[i]=0;
}
for(i=2;i<MAX;++i)
{
for(k=i*2;k<MAX;k+=i)
{
s[k]=1;
}
}
number=0;
for(i=2;i<1299710;++i)
if(s[i]==0)
prime[number++]=i;
int prime_huan(__int32 n);
while(cin>>n)
{
if(n==0)
break;
if(prime_huan(n))
{
cout<<0<<endl;
continue;
}
for(i=0;i<number;++i)
{
if(prime[i]<n&&prime[i+1]>n)
cout<<(prime[i+1]-prime[i])<<endl;
}
}
return 0;
}
int prime_huan(__int32 n)
{
__int32 i;
if(n==2)
return 1;
if(n<=1||n%2==0)
return 0;
i=3;
while((i*i)<=n)
{
if(n%i==0)
return 0;
i+=2;
}
return 1;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值