您的位置:首页 > 其它

【蓝桥杯】素数距离

2018-03-10 15:26 155 查看
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int nex[8000000]; //nex[i]表示i的下一个相邻素数
//int dist[8000000]; //dist[i]表示i到下一个相邻素数的距离
int f[8000010];
const int inf=10000000;
int main()
{
int l,r;
cin>>l>>r;
memset(f,0,sizeof(f));
f[1]=1; //这里为了方便,把1当作合数处理
for(int i=2;i*i<=r;i++)
{
if(f[i]==0)
for(int j=i*i; j<=r; j+=i)
{
f[j]=1;
}
}
int minn=inf;
int maxx=0;
int a,b,c,d;
//for(int i=0;i<8000000;i++)
// dist[i]=inf;
memset(nex,0,sizeof(nex));
int flag=0;
for(int i=l;i<=r;i++)
{
int dist=inf;
if(f[i]==0)
{
for(int j=i+1;j<=r;j++)
{
if(f[j]==0 )
{
nex[i]=j;
dist=j-i;
flag=1;
break;
}
}
}
if(minn>dist && dist!=inf)
{
minn=dist;
a=i;
b=nex[i];
}
if(maxx<dist && dist!=inf)
{
maxx=dist;
c=i;
d=nex[i];
}
}
if(flag==1)
cout<<a<<","<<b<<" are closest, "<<c<<","<<d<<" are most distant.";

else
cout<<"There are no adjacent primes.";
return 0;
}几经调试,学到了一些以后编程应该注意的小地方:
一、关于memset。虽然有看见别人在main函数里memset数组为一些其他值,但对我来说,以防出错,以后只在想将数组全部初始化为0时才用memset。(比如这次,memset为1和inf,发现都没用;因此,对于素数打表法,就统一默认f[素数]为0,f[合数]为1)。
二、关于素数打表。对于素数打表法,就统一默认f[素数]为0,f[合数]为1,这样一开始memset为0比较方便。而且,要记得把f[1]=1,虽然1既不是素数也不是合数,但应该把它当合数处理,这样就不会干扰题目中的素数答案了。
三、关于数组的命名。很奇怪,我把数组命名成next和distance,去memset都说出错(reference to ' next ' is ambiguous),改名为nex和dist之后就对了。所以,以后数组还是命名特别一点比较好。。。
四、关于简化内存。比如我这里本来想用dist[i]表示i到下一个素数的距离,但是其实根本不需要这个数组,只需要一个临时变量在循环里现去比较就对了。解决了内存超限的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: