NYOJ 素数距离问题

最近讲的有点听不懂了,决定做简单题先提升代码能力。

              素数距离问题

时间限制:3000 ms  |  内存限制:65535 KB

难度:2

输入

第一行给出测试数据组数N(0<N<=10000)
接下来的N行每行有一个整数M(0<M<1000000),

输出

每行输出两个整数 A B.
其中A表示离相应测试数据最近的素数,B表示其间的距离。

样例输入

3
6
8
10

样例输出

5 1
7 1
11 1

描述

现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。如果左右有等距离长度素数,则输出左侧的值及相应距离。
如果输入的整数本身就是素数,则输出该素数本身,距离输出0。

其实,这道题不难,就是计算素数距离,首先呢,判断是不是素数,打表加素数筛的方法,接下来就是难点了。在代码中会具体介绍。主要就是距离的判断,分为几种情况,本身是素数,不是的话,判断它的前面是不是素数,而且要大于零。它的后面是不是素数,如果是的话就判断距离。差不多就是这个思路。其实这也是我看一个博客后写的,emmm,一定要自己多实现,多提升代码能力。

//其实思路就是首先判断是不是素数,素数筛的方法
//并且判断和它相距最近的素数,存在素数表中的下一位,并且求距离
//首先素数筛,接着数组存放减去距离·
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
const int maxn=1000005;
int a[maxn];
using namespace std;
void isPrime()
{
  a[1]=1;//1是素数记为1
  for(int i=2;i*i<maxn;i++)//为啥是i*i就是取个比较大的值
  {
    if(!a[i])//如果不是素数表
    for(int j=i*i;j<maxn;j+=i)//i*i的值是小于最大值的j+i就是递增的多一点
        a[j]=1;//a[i]是在素数表里的i*i肯定是合数a[j]肯定是合数
  }
}
int main()
{
  isPrime();
  int T,num,numup,numdown;//重要的就是距离整数最近的素数,注意变量的定义
  cin>>T;
  while(T--)
  {
    scanf("%d",&num);
    if(a[num]==0)//如果是素数则输出
    {
      printf("%d 0\n",num);
    }
    else
    {
        numup=numdown=num;//初始化注意位置
        while(a[numup]!=0)//判断后一个元素是否为0
         numup++;//后一个元素一直往后递增
        while(a[numdown]!=0&&numdown>0)//前一个元素不是0而且要大于0
         numdown--;//再往前递减
        if(numdown==0)//后一个元素是0的情况
        {
          printf("%d %d\n",numup,numup-num);
        }
        else if(numup-num>=num-numdown)//判断距离这个应该比较好理解
        {
          printf("%d %d\n",numdown,num-numdown);
        }
        else
        {
          printf("%d %d\n",numup,numup-numdown);
        }
    }
  }

  return 0;
}

其实和大佬博客差不多,就是自己看懂了学会写了再发一遍,我们老师说过一句话,别人代码你要自己写不调试,不看别人的提示能过才可以,也要去不断复习。

猜你喜欢

转载自blog.csdn.net/cjh1459463496/article/details/81843566