日期:2014-05-17 浏览次数:20692 次
class Main { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(getLevel(3)); System.out.println(getLevel(53)); System.out.println(getLevel(103)); System.out.println(getLevel(153)); System.out.println(getLevel(203)); } private static String getLevel(final int x) { int left = x / 50; int right = left + 1; return "[" + (left * 50 + 1) + ", " + right * 50 + "]"; } } // result: // [1, 50] // [51, 100] // [101, 150] // [151, 200] // [201, 250]
------解决方案--------------------
还是不太明白LZ你的要求,LZ要求每个级别包含的元素是50的倍数,还是说之要求最大的是50的倍数?
即
第1级是 1-50
第2级是 51-2500(这样的话,51-2500只有2450个元素,最大的2500是50的倍数) --A
还是说
第2级是 51-2550(也就是说第2级有2500个元素,也就是说元素的个数是50的倍数) --B
16L的代码是 --B 的情况
如果是--A情况,改下代码就可以了
给LZ写了段测试代码
import java.util.*; public class Test { static TreeMap<Integer, Integer> map = new TreeMap<Integer, Integer>(); static { //因为map信息是重复使用的,所以把16L的map部分抽出来 int sum = 0, times = 50; for (int i=0; i<5; i++) { map.put(sum, i+1); sum = (sum == 0 ? times : sum*times); } } public static void main(String[] args) throws Throwable { for (int i=0, j=1; i<5; i++, j*=50) { System.out.printf("边界测试当前分数:分数=%d, 级别=%d\n", j, getLevel(j)); System.out.printf("边界测试下个分数:分数=%d, 级别=%d\n", j+1, getLevel(j+1)); int k = (int)(Math.random()*j); System.out.printf("随机测试:分数=%d, 级别=%d\n", k, getLevel(k)); System.out.println(); } Scanner sc = new Scanner(System.in); System.out.print("请输入一个[1-312500000]范围内的整数:"); int score = sc.nextInt(); System.out.printf("输入的分数为:%d, 该分数对应的等级为:%d\n", score, getLevel(score)); } public static int getLevel(int score) { if (score < 1 || score > 312500000) return -1; //超出范围 return map.lowerEntry(score).getValue().intValue(); } }
------解决方案--------------------
昨晚忘了贴代码了。大致的思路是这样的。
public class Test{ public static void main(){ getQUJIAN(1); } public static int[] getQUJIAN(int data){ int start; int end; start = end = 0; int lev = getLev(data); if(lev==5){ start = end = data; return new int[]{start,end}; } else{ start =(int)(data * Math.pow(5-lev)) + 1; end = start +(int)Math.pow(5-lev) - 1; return new int[]{start,end}; } } public static int getLev(int data){ int lev = 1; if(data > Math.pow(50,lev)){ data = data - (int)Math.pow(50,lev); lev++; } if(lev > 5){ throw new RuntimeException(); } } }