本文主要是介绍南阳oj 题目24 素数距离问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
素数距离问题
- 描述
- 现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。如果左右有等距离长度素数,则输出左侧的值及相应距离。
如果输入的整数本身就是素数,则输出该素数本身,距离输出0- 输入
- 第一行给出测试数据组数N(0<N<=10000)
接下来的N行每行有一个整数M(0<M<1000000), 输出 - 每行输出两个整数 A B.
其中A表示离相应测试数据最近的素数,B表示其间的距离。 样例输入 -
3 6 8 10
样例输出 -
5 1 7 1 11 1
- 第一行给出测试数据组数N(0<N<=10000)
注:此题为:南阳oj 题目24 素数距离问题
说明:数据较大,容易超时,尽量不要用cin和cout;要分清循环边界
先用打表法打出素数表,然后在向左,向右进行查找。
已AC源代码:
#include<stdio.h>
#define MAX 1000010
int a[MAX];
void yjj()
{int i,j;for(i=0;i<MAX;++i)a[i]=1;a[0]=a[1]=0;for(i=2;i<MAX;++i) //筛素数法 1为素数,0为非素数 {if(a[i]==1){for(j=i+i;j<MAX;j+=i)a[j]=0;}}
}int main()
{int N;yjj();scanf("%d",&N);while(N--){int m,i,j;scanf("%d",&m);if(a[m]==1) //m为素数 printf("%d 0\n",m);else //m 不为素数 {i=j=m; //i向左查找,j向右查找 while(a[i]==0&&i>=0) i--;while(a[j]==0) j++;if(i<0)printf("%d %d\n",j,j-m);else if(m-i<=j-m)printf("%d %d\n",i,m-i);elseprintf("%d %d\n",j,j-m);}}return 0;
}
这篇关于南阳oj 题目24 素数距离问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!