素数距离问题

来源:互联网 发布:软件风格 编辑:程序博客网 时间:2024/06/05 09:05

素数距离问题

时间限制:3000 ms  |  内存限制:65535 KB
难度:2
描述
现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。如果左右有等距离长度素数,则输出左侧的值及相应距离。
如果输入的整数本身就是素数,则输出该素数本身,距离输出0
输入
第一行给出测试数据组数N(0<N<=10000)
接下来的N行每行有一个整数M(0<M<1000000),
输出
每行输出两个整数 A B.
其中A表示离相应测试数据最近的素数,B表示其间的距离。
样例输入
36810
样例输出
5 17 111 1

来源

方法1:

01.#include<stdio.h>
02.#include<math.h>
03. 
04.bool prime(int n)
05.{
06.int k;
07.if(n<2)
08.return false;
09.for(k=2;k<=sqrt(n);k++)
10.{   if(n%k==0)  break;}
11.if(k>sqrt(n))
12.return true;
13.return false;
14.}
15. 
16.int main()
17.{
18.int m,n,i,j,mup,mdown,dup,ddown;
19.scanf("%d",&n);
20.while(n--)
21.
22.scanf("%d",&m);
23.if(m==1)
24.printf("2 1\n");
25.else
26.{
27.if(prime(m))
28.printf("%d 0\n",m);
29.else
30.{
31.mup=mdown=m;
32.while(!prime(mup))
33.{
34.mup+=1;
35.}
36.while(!prime(mdown)&&mdown>0)
37.{
38.mdown-=1;
39.}
40.dup=mup-m;
41.ddown=m-mdown;
42.if(mdown==0)
43.printf("%d %d\n",mup,dup);
44.else if(dup>=ddown)
45.printf("%d %d\n",mdown,ddown);
46.else
47.printf("%d %d\n",mup,dup);
48.}
49.}
50.}
51.return 0;
52.}

方法2:

01.#include<stdio.h>
02.#include<math.h>
03. 
04.bool prime(int n)
05.{
06.int k;
07.if(n<2)
08.return false;
09.for(k=2;k<=sqrt(n);k++)
10.{   if(n%k==0)  break;}
11.if(k>sqrt(n))
12.return true;
13.return false;
14.}
15. 
16.int main()
17.{
18.int m,n,i,j;
19.scanf("%d",&n);
20.while(n--)
21.
22.scanf("%d",&m);
23.if(m==1)
24.printf("2 1\n");
25.else
26.{
27.if(prime(m))
28.printf("%d 0\n",m);
29.else
30.{
31.for(i=m-1;i>0;i--)
32.if(prime(i))  break;
33.for(j=m+1;j<1000000;j++)
34.if(prime(j)) break;
35.if(i==0)
36.printf("%d %d\n",j,j-m);
37.else if(m-i<=j-m)
38.printf("%d %d\n",i,m-i);
39.else
40.printf("%d %d\n",j,j-m);
41. 
42.}
43.}
44.}
45.return 0;
46.}

0 0