import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Scanner;
/**
* 题意:给出 多组 maxNum(1~1000) 和 length,让你从N内素数的中间项向外扩展C个素数,
* 比如给出7 1,素数有5个(注意此题出题人坑爹得让1作为"素数") 1,2,3,5,7
* 那么应输出7 1:3 5 7(注意输出格式)特别的,偶数个素数输出 2*length-1 个,奇数个则输出 2*length 个。
*
* 分析:线性素数筛法+模拟即可
*
* @author TinyDolphin
*
*/
public class Main {
private static final int LENGTH_CHECK = 13000;
private static final int LENGTH_PRIMELIST = 1300;
private static boolean[] check = new boolean[LENGTH_CHECK];
private static int[] primeList = new int[LENGTH_PRIMELIST];
// 欧拉筛法:稍加修改,包含了 1
private static void getPrimeList(int num) {
primeList[0] = 1;
int count = 1;
for (int indexI = 2; indexI < num; indexI++) {
if (!check[indexI]) {
primeList[count++] = indexI;
}
for (int indexJ = 1; indexJ <= count; indexJ++) {
if (indexI * primeList[indexJ] >= num) {
break;
}
check[indexI * primeList[indexJ]] = true;
if (indexI % primeList[indexJ] == 0) {
break;
}
}
}
}
public static void main(String[] args) {
Scanner in = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
getPrimeList(10010); // 数组使用长度只有 1229,所以数组长度,开的稍大即可。
int maxNum; // 不能超过的最大素数
int length; // 输出的一侧素数的个数(从中间开始)
while (in.hasNext()) {
maxNum = in.nextInt();
length = in.nextInt();
int index = Arrays.binarySearch(primeList, 0, maxNum / 2 + 1, maxNum);
if (index < 0) {
index = -(index + 1) - 1;
}
out.print(maxNum + " " + length + ":");
// 一下模拟要求,进行输出。
int left; // 存储最左边的素数的下标
// 当下标为奇数时
if (index % 2 != 0) {
left = index / 2 - length + 1 < 0 ? 0 : index / 2 - length + 1;
} else {
length--;
left = index / 2 - length < 0 ? 0 : index / 2 - length;
}
for (; left <= index && left <= index / 2 + length; left++) {
out.print(" "+primeList[left]);
}
// 注意:每组输出数据都有一换行
out.print("\n\n");
}
out.flush();
}
}
POJ 1595(Prime Cuts) 素数筛法+模拟 Java
最新推荐文章于 2020-02-28 10:40:37 发布