Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
贴Java代码。筛选后排序+二分查找 ,带注释//筛选后排序+二分查找 import java.util.*; public class Main{ static final int n = 250001; // nums用于进行筛选,Hprimes用于保存生成出来的Hprime static boolean nums[] = new boolean[n]; static ArrayList<Integer> Hprimes = new ArrayList<Integer>(); // 用筛选法生成Hprimes static void generate_Hprimes(){ for(int i = 0; i < n; i++) nums[i] = true; nums[0] = nums[1] = false; for(int i = 1; i < n; i++){ // 第一个Hnumber int n1 = 4*i + 1; for(int j = 1; j <= i; j++){ // 第二个Hnumber int n2 = 4*j + 1; // 两者相乘得到一个由2个Hnum构成的Hnum int n3 = n1 * n2; if(n3 > 4*n) break; // 如果这个数还没有被筛选掉,则说明这个数是Hprime if(nums[n3/4]){ // 将这个数放入Hprimes Hprimes.add(n3); // 进行筛选 for(int p = n3 * 1; p < 4*n; p += 4*n3){ nums[p/4] = false; } } } } } public static void main(String[] args) { Scanner s = new Scanner(System.in); // 生成Hprimes,然后升序排序 generate_Hprimes(); Collections.sort(Hprimes); while(true) { int h = s.nextInt(); if(h==0) break; // 对于输入的数字进行二分查找,然后下标就是答案 int l = 0, r = Hprimes.size()-1; while(l<=r){ int m = (l+r)/2; if(Hprimes.get(m) > h){ r = m - 1; }else{ l = m + 1; } } System.out.println(h+" "+l); } } } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator