日期:2014-05-17  浏览次数:20649 次

一个数学题,求个算法。
5个级别的数字
第一级为1-50,第2级从51开始,每个数字对应的区间为50,第5级为最后的级别
例子: 
第1级 第2级 第3级 第4级 第5级

  51 同样的有50个区间 依次类推 第5级后面就没有了。
1 52
  53
  ...
  100

2 101 

3
4
...
50



求当前数字为 X(X>0 为正整数,不会超过第5级的最大值) 时,得到第5级的区间,当x为第5级的数字时,提示当前为第5级.

小弟数学不好,哪位大神帮下忙,谢谢!

------解决方案--------------------
实在是没太看懂。
是5个区间,每个区间是50个数,然后随便录入一个数,问这个数在哪个区间?
如果这样,那除以50就好了,结果是几,再加1就对了。
应该不是这么简单的要求吧?
------解决方案--------------------
Java code

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写了段测试代码

Java code
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();
    }
}

------解决方案--------------------
昨晚忘了贴代码了。大致的思路是这样的。
Java code

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();
           }
     }
}