素数距离问题(c初学的困惑)

题目来源:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=24

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

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

输出

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

上传者 hzyqazasdf

分析:
1.涉及到素数的判断
2.找该数相邻最近的素数。分为从左侧(左侧最多到2,我是从该数往下减的),从右侧(挨个往上加进行素数判断)。
3..如果左右有等距离长度素数,则输出左侧的值及相应距离。 得到左右侧 距离和素数要进行比较

代码:


#include<stdio.h>
#include<string.h>
#include<math.h>
bool prime(int m)   //判断素数
{
    int i;
    if(m<2)         //小于2的 不是素数
        return 0;
    for(i=2;i<=sqrt(m);i++) //从2到该数的平方根
    {
        if(m%i==0)      //如果该数可以被这范围得数整除 表示该数不是素数 返回0即flase
            return 0;   //返回0即flase
    }
    if(i>=sqrt(m))  //如果是正常结束 即 表示该数不可以被这范围内地数整除 表示 该数是素数
        return 1//返回1即true
}

int main()
{
    int n,i,c,len,value,m,x,t;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&m);
        c=prime(m); //判断该数是否是素数
        if(c)   //是,直接输出,其距离为0
            printf("%d 0\n",m);
        else        //不是素数
        {
            for(i=m+1;;i++)//向右侧查找素数
            {
                c=prime(i);//判断该数是否是素数
                if(c)
                {
                    len=i-m;//得到右距离
                    value=i;//得到右素数 
                    break;
                }
            }
            for(i=m-1;i>=2;i--)//想左侧查找素数
            {
              c=prime(i);//判断该数是否是素数
              if(c)
              {
                  if(len<m-i)//左侧距离大于右侧距离 则素数距离和素数 应该为右侧的
                    break;
                  else  //否则为左侧的
                  {
                    len=m-i; 
                    value=i;
                    break;
                  }
              }
            }

            printf("%d %d\n",value,len);//输出结果
        }
    }
    return 0;
}

样例输入

3
6
8
10

样例输出

5 1
7 1
11 1

运行结果:
这里写图片描述

总结:当时错在左右距离相等时,总是输出的右边

猜你喜欢

转载自blog.csdn.net/shuisebeihuan/article/details/81487308