***题目来源:***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
运行结果:
总结:当时错在左右距离相等时,总是输出的右边