| ||||||||||
| 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