#include <iostream>
#include <math.h>
using namespace std;
const int N=1000;
int prime1[N];
int num,j,k;
bool isPrime(int a)
{
for(int i=2;i<=(int)floor(sqrt((double)a));i++)
{
if(a%i==0)
return false;
}
return true;
}
bool isPrime2(int a)
{
int i=0;
while (prime1[i]*prime1[i]<=a)
{
if (a%prime1[i]==0)
{
return false;
}
i++;
}
return true;
}
int main()
{
int numofp=0;
for(int i=2;i<=2000;i++)
if (isPrime(i))
prime1[numofp++]=i;
while (cin>>num&&num!=0){
if (isPrime2(num))
{
cout<<0<<endl;
continue;
}
for (j=num+1;;j++)
if (isPrime2(j))
break;
for(k=num-1;;k--)
if (isPrime2(k))
break;
cout<<j-k<<endl;
}
return 0;
}
方法一: 最原始方法:
bool isPrime(int a)
{
for(int i=2;i<a;i++)
{
if(a%i==0)
return false;
}
return true;
}
方法二: 遍历到 根号a 向下取整 的那个整数为止:
bool isPrime(int a)
{
for(int i=2;i<=(int)floor(sqrt((double)a));i++)
{
if(a%i==0)
return false;
}
return true;
}
方法三: 由于2到 根号a 向下取整 的那个整数 之间有很多合数是不需要 通过整除它们 来判断,故维护一个 素数数组,只若能整除素数,则不是素数。方法如下:
bool isPrime2(int a)
{
int i=0; //注意i的下标开始。
while (prime1[i]*prime1[i]<=a) //maintain an array prime1[] consist of primes.
{
if (a%prime1[i]==0)
{
return false;
}
i++;
}
return true;
}