POJ 1595(Prime Cuts) 素数筛法+模拟 Java

素数筛法+模拟【点击蓝色字体,即可查看素数筛法详情】

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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值