当前位置: 代码迷 >> Java Web开发 >> 一个数学题,求个算法。解决方案
  详细解决方案

一个数学题,求个算法。解决方案

热度:5675   发布时间:2013-02-25 21:17:25.0
一个数学题,求个算法。
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();           }     }}
  相关解决方案