素数距离问题
时间限制:3000 ms | 内存限制:65535 KB
难度:2
描述
现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。如果左右有等距离长度素数,则输出左侧的值及相应距离。
如果输入的整数本身就是素数,则输出该素数本身,距离输出0
输入
第一行给出测试数据组数N(0<N<=10000)
接下来的N行每行有一个整数M(0<M<1000000),
输出
每行输出两个整数 A B.
其中A表示离相应测试数据最近的素数,B表示其间的距离。
样例输入
3
6
8
10
样例输出
5 1
7 1
11 1
讲解:本题用的是,事先打表的方法;
1 #include<stdio.h> 2 #include<string.h> 3 int v[1000000+10]; 4 5 int main() 6 { 7 int i,j,k,n,m,tot,x,y; 8 memset(v,0,sizeof(v));//值为0则是素数 9 v[1]=0; 10 tot=0; 11 for(i=2;i<=1000010;i++) 12 if(!v[i]) 13 { //v[i]:第(++tot)个素数 14 for(j=2;i*j<=1000010;j++) v[i*j]=1;//一开始这一点考虑少了1000000最近的输出了1000001应该是1000003 3,扩大了一下数据就对了 15 } 16 17 /*for(i=0;i<100;i++) 18 if(v[i]==0) 19 printf("%d ",i);*/ 20 scanf("%d",&m); 21 while(m--) 22 { 23 scanf("%d",&n); 24 if(n==1) 25 printf("2 1 "); 26 else 27 { 28 for(x=0,i=n;;i--,x++) 29 if(v[i]==0) 30 break; 31 for(y=0,j=n;;j++,y++) 32 if(v[j]==0) 33 break; 34 if(x>y) 35 printf("%d %d ",j,j-n); 36 else if(x<y) 37 printf("%d %d ",i,n-i); 38 else printf("%d %d ",i,n-i); 39 } 40 } 41 return 0; 42 }