POJ2689 Prime Distance

本文介绍了一种用于找出特定范围内所有素数的有效算法。通过构造一个小的素数表,并利用该表来筛选出指定区间内的素数,适用于处理较大数值的情况。

题目:http://acm.pku.edu.cn/JudgeOnline/problem?id=2689

思路:找出不大于1000000的范围的素数。但是这个值可能很大,所以必须用筛选才能做。

            可以先构造一个小的素数表,在进行区间的素数的筛选,这个小素数表的范围是2~sqrt(Integer.MAX_VALUE)。还有中间的处理可能会越界,小心处理。

  1. import java.util.Scanner;
  2. public class Main {
  3.     final static int MAXVALUE = (int) Math.sqrt(Integer.MAX_VALUE) + 1;
  4.     public static void main(String[] args) {
  5.         int k, l, u, tt, index;
  6.         boolean hasFlg;
  7.         int a, b, aa, bb;
  8.         int[] num = new int[MAXVALUE];
  9.         boolean[] frimeflg = new boolean[MAXVALUE];
  10.         boolean[] flg;
  11.         index = 1;
  12.         // 构造一个小素数表
  13.         for (int i = 2; i < MAXVALUE; i++) {
  14.             if (!frimeflg[i]) {
  15.                 k = i * 2;
  16.                 num[index++] = i;
  17.                 while (k < MAXVALUE) {
  18.                     frimeflg[k] = true;
  19.                     k += i;
  20.                 }
  21.             }
  22.         }
  23.         Scanner scan = new Scanner(System.in);
  24.         while (scan.hasNextInt()) {
  25.             l = scan.nextInt();
  26.             u = scan.nextInt();
  27.             tt = (int) Math.sqrt(u);
  28.             // 构造一个u-l+1的区间
  29.             flg = new boolean[u - l + 1];
  30.             // 筛选区间,不是素数的标记为true
  31.             for (int i = 1; i < index && i <= tt; i++) {
  32.                 k = Math.max(num[i], l / num[i]);
  33.                 if (k * num[i] < l || k <= 1) {
  34.                     k++;
  35.                 }
  36.                 if (k <= 1) {
  37.                     k++;
  38.                 }
  39.                 while ((long) k * num[i] <= u) {
  40.                     flg[k * num[i] - l] = true;
  41.                     k++;
  42.                 }
  43.             }
  44.             hasFlg = false;
  45.             a = 0;
  46.             b = Integer.MAX_VALUE;
  47.             aa = 0;
  48.             bb = 0;
  49.             if (l == 1) {
  50.                 flg[0] = true;
  51.             }
  52.             for (int i = 0; i < u - l + 1; i++) {
  53.                 if (!flg[i]) {
  54.                     for (int j = i + 1; j <= u - l; j++) {
  55.                         if (!flg[j]) {
  56.                             if (b - a > j - i) {
  57.                                 a = i + l;
  58.                                 b = j + l;
  59.                             }
  60.                             if (bb - aa < j - i) {
  61.                                 bb = j + l;
  62.                                 aa = i + l;
  63.                             }
  64.                             hasFlg = true;
  65.                             break;
  66.                         }
  67.                     }
  68.                 }
  69.             }
  70.             if (hasFlg) {
  71.                 System.out.printf(
  72.                         "%d,%d are closest, %d,%d are most distant./n", a, b,
  73.                         aa, bb);
  74.             } else {
  75.                 System.out.println("There are no adjacent primes.");
  76.             }
  77.         }
  78.     }
  79. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值