ceil()//上取整
floor()//下取整
//判断一个数是不是素数
bool is_prime(int n)
{
if(n<2) return false;
for(int i=2;i<=n/i;i++)
{
if(n%i==0)
return false;
}
return true;
}
//判断一堆数是不是素数
int prim[N]; //prim[]初始化为0 0代表素数,1代表合数
void solve(int TOP)
{
prim[0]=prim[1]=1;
for(int i=2;i*i<TOP;i++)
if(!prim[i])
for(int j=i*i;j<TOP;j+=i)
prim[j]=1;
}
//分解质因数
int solve(int n)
{
int a[10000];//底数
map<int,int> mp; //底数出现的次数
int num=0;
memset(a,0,sizeof a);
mp.clear();
for(int i=2;i<=n/i;i++)
{
if(n%i==0)
a[num++]=i;
while(n%i==0)
{
mp[i]++;
n=n/i;
}
}
if(n>1)
{
a[num++]=n;
mp[n]++;
}
for(int i=0;i<num;i++)
cout<<a[i]<<" "<<mp[a[i]]<<endl;
cout<<endl;
}
//扩展欧几里得
int exgcd(int a, int b, int &x, int &y)
{ // 拓展欧几里得算法, 也就是生成贝祖数的算法
if (!b)
{
y = 0; x = 1;
return a;
}
exgcd(b, a % b, y, x);
y -= a / b * x; // 贝祖数的递推公式
return d;//返回值是最大公约数,xy是其中的一组解
}
还得补充一句话,就是约数个数=累乘(幂次方+1)
~
~
~
~
~
~
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=11092019;
const int N=1000010;
int prim[N],pri[N],cnt;
ll st[N];
void shusu(int top)
{
prim[0]=prim[1]=1;
for(int i=2;i*i<=top;i++)
if(!prim[i])
for(int j=i*i;j<=top;j+=i)
prim[j]=1;
for(int i=0;i<=top;i++)
if(!prim[i])
pri[cnt++]=i;
}
int main()
{
shusu(55555);
ll l,r;
while(cin>>l>>r)
{
memset(st,0,sizeof st);
for(ll i=0;i<cnt;i++)
{
ll p=pri[i];
for(ll j=max(2*p,(ll)(ceil(l*1.0/p)*p));j<=r;j+=p)
st[j-l]=1;
}
//ceil(l*1.0/p)*p
//(l+p-1)/p*p
ll sum=0;
for(int i=0;i<=r-l;i++)
if(!st[i]&&i+l>=2)
prim[sum++]=i+l;
if(sum<2)
cout<<"There are no adjacent primes."<<endl;
else
{
int minn=0,maxx=0;
for(int i=0;i<sum-1;i++)
{
int d=prim[i+1]-prim[i];
if(d<prim[minn+1]-prim[minn])
minn=i;
if(d>prim[maxx+1]-prim[maxx])
maxx=i;
}
printf("%d,%d are closest, %d,%d are most distant.\n",prim[minn],prim[minn+1],prim[maxx],prim[maxx+1]);
}
}
return 0;
}