NYOJ 素数距离问题

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

              素数距离问题

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

难度:2

输入

第一行给出测试数据组数N(0 接下来的N行每行有一个整数M(0

输出

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

样例输入

3
6
8
10

样例输出

5 1
7 1
11 1

描述

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

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

//其实思路就是首先判断是不是素数,素数筛的方法
//并且判断和它相距最近的素数,存在素数表中的下一位,并且求距离
//首先素数筛,接着数组存放减去距离·
#include
#include
#include
#include
#include
const int maxn=1000005;
int a[maxn];
using namespace std;
void isPrime()
{
  a[1]=1;//1是素数记为1
  for(int i=2;i*i>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;
}

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

你可能感兴趣的:(c++水题)