24.素数距离问题

来源:互联网 发布:mp4播放器软件下载 编辑:程序博客网 时间:2024/06/14 05:02
描述

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

如果输入的整数本身就是素数,则输出该素数本身,距离输出0。
输入
第一行给出测试数据组数N(0<N<=10000)
接下来的N行每行有一个整数M(0<M<1000000)
输出
每行输出两个整数 A B.
其中A表示离相应测试数据最近的素数,B表示其间的距离。
样例输入
36810
样例输出
5 17 111 1


0<M<1000000,因此需要筛法打表。

陷阱:M的界限是(0,1000000)但相邻素数不一定在这个范围内。

经计算得,所需的最后一个素数是1000003。

代码如下。

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. #include <stdio.h>  
  2.   
  3. int notPrime[1000004] = { 1, 1 };  
  4.   
  5. void init();  
  6.   
  7. int main() {  
  8.     int n, distance;  
  9.     init();  
  10.     scanf("%d\n", &n);  
  11.     while (n--) {  
  12.         int now;  
  13.         distance = 0;  
  14.         scanf("%d\n", &now);  
  15.         while (1) {  
  16.             if (now - distance > 0 && !notPrime[now - distance])  
  17.                 break;  
  18.             else if (now + distance < 1000004 && !notPrime[now + distance]) {  
  19.                 distance *= -1;  
  20.                 break;  
  21.             }  
  22.             distance++;  
  23.         }  
  24.         printf("%d %d\n", now - distance, distance > 0 ? distance : -distance);  
  25.     }  
  26.     return 0;  
  27. }  
  28.   
  29. void init() {  
  30.     int i, j;  
  31.     for (i = 2; i < 1001; i++)  
  32.         if (notPrime[i])  
  33.             continue;  
  34.         else  
  35.             for (j = i * i; j < 1000004; j += i)  
  36.                 notPrime[j] = 1;  
  37. }  
0 0