【蓝桥杯】素数距离


#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到下一个素数的距离,但是其实根本不需要这个数组,只需要一个临时变量在循环里现去比较就对了。解决了内存超限的问题。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值