素数距离问题

来源:互联网 发布:做吉他谱的软件 编辑:程序博客网 时间:2024/06/08 03:24


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

输入

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

输出

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

样例输入

36810

样例输出

5 17 111 1
依次从一个数开始往两边查找,第一个数为素数或者小与2结束查找,查找完毕比较距离就行了此外还需要考虑左边没有素数的情况

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;


int f(int n){
    int i;
    if(n==1) return 0;
    for(i=2;i<=sqrt(n);i++){
        if(n%i==0){
            return 0;
            break;
        }
    }
    return 1;
}
int main()
{
    int n,num,numUp,numDown,deltUp,deltDown;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&num);
        if(f(num))//本身是素数,后面就不用了
          printf("%d 0\n",num);
        else
        {
            numUp=numDown=num;
            while(!f(numUp))
            {
                numUp+=1;
            }
            while(!f(numDown)&&numDown>0)//边界条件,否则不能通过
            {
                numDown-=1;
            }
            deltUp = numUp-num;
            deltDown = num-numDown;


            if(numDown==0)//特殊情况:左边没有找到
              printf("%d %d\n",numUp,deltUp);
            else if(deltUp>=deltDown)//输出距离小的, 相等则左
                printf("%d %d\n",numDown,deltDown);
            else
                printf("%d %d\n",numUp,deltUp);
        }


    }
    //system("PAUSE");
    return 0;
}



0 0
原创粉丝点击