POJ 1595:Prime Cuts

Description

一个素数是一个只能被1和自己整除的数(这里1是素数)。在这个问题中,你需要写一个程序,这个程序能够在[1,N]范围的素数列表中截取一部分素数。你的程序将读入一个数字N,判定[1,N]中的素数列表L;如果L的长度是偶数,则输出最中间的C*2个素数,如果L的长度是奇数,则输出最中间的C*2-1个素数。

Input

每个输入集都在一行中,且包含两个数字,第一个数字是N($1\le N \le 1000$),第二个数字是C($1 \le C\le N$),我们需要求出[1,N]中的全部素数组成一个列表,如果这个列表长度是偶数,则输出最中间的C*2个素数;如果这个列表长度是奇数,则输出最中间的C*2-1个素数。

Output

对于每个输入集,你应该先输出N,接下来跟一个空格,然后是C,再跟一个冒号(:),然后是素数列表当中的中间一段素数。如果需要输出的素数长度超过了素数列表的长度,则就输出整个素数列表。每个素数输出后都需要有一个空格。每行输出都需要空一行。因此你的输出应该类似于Sample output中的形式。

Sample Input

21 2
18 2
18 18
100 7

Sample Output

21 2: 5 7 11

18 2: 3 5 7 11

18 18: 1 2 3 5 7 11 13 17

100 7: 13 17 19 23 29 31 37 41 43 47 53 59 61 67

Source

 1 import java.util.ArrayList;
 2 import java.util.List;
 3 import java.util.Scanner;
 4 
 5 public class Main {
 6     public static List<Integer> sieve(int n){
 7         boolean[] arr = new boolean[n+1];
 8         for(int i=0;i<arr.length;i++)
 9             arr[i] = true;
10         int bound = (int)Math.floor(Math.sqrt(n));    //根号n
11         for(int i=2;i<=bound;i++){
12             if(arr[i]){
13                 for(int j=2;j*i<=n;j++){
14                     arr[i*j] = false;
15                 }
16             }
17         }
18         ArrayList<Integer> list = new ArrayList<Integer>();
19         for(int i=1;i<arr.length;i++){
20             if(arr[i]) {
21                 list.add(i);
22             }
23         }
24         return list;
25     }
26     public static void method(int N,int C){
27         int old_N = N;
28         int old_C = C;
29         List<Integer> list = sieve(N);
30         int size = list.size();
31         int print_size = 0;    //输出的长度
32         int begin = 0;        //开始输出的位置
33         if(size%2==0){
34             print_size = C * 2;
35             if(print_size > size){
36                 print_size = size;
37                 begin = 0;
38             }
39             else{
40                 begin = size / 2 - C;
41             }
42         }
43         else{
44             print_size = C * 2 - 1;
45             if(print_size > size){
46                 print_size = size;
47                 begin = 0;
48             }
49             else{
50                 begin = size / 2 - C + 1;
51             }
52         }
53         System.out.print(old_N+" "+old_C+": ");
54         for(int i=begin;i<begin+print_size;i++){
55             System.out.print(list.get(i)+" ");
56         }
57         System.out.println("\n");
58     }
59     public static void main(String[] args) {
60         Scanner in = new Scanner(System.in);
61         while(true){
62             String line = in.nextLine().trim();
63             if(line==null || "".equals(line)){
64                 return;
65             }
66             String arr[] = line.split(" ");
67             int N = Integer.parseInt(arr[0]);
68             int C = Integer.parseInt(arr[1]);
69             method(N,C);
70         }
71         
72     }
73 }
View Code
作者:xiazdong
出处:http://blog.xiazdong.info
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
原文地址:https://www.cnblogs.com/xiazdong/p/3130040.html