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

 

你可能感兴趣的:(Prim)