当前位置: 代码迷 >> J2SE >> 求最后个数的方法解决方案
  详细解决方案

求最后个数的方法解决方案

热度:266   发布时间:2016-04-24 13:25:08.0
求最后个数的方法
有 1 到3000的数(1 2 3 4 .....)
间隔1取出数据,把新得到的列再间隔1取出,依次循环下去,问最后得出的数是多少>?
如第一次循环为(2 4 6 8 ....)
第2次为(4 8...)
最好写出代码.

------解决方案--------------------
就是比3000小的那个最大的2的多少次幂。
2048
------解决方案--------------------
就是比3000小的那个最大的2的多少次幂。
2048
------解决方案--------------------
测试一下,呵呵。

Java code
[BanUBB]public class LastNumber {    public static void main(String[] args) {        int n = 3000;        System.out.println(Integer.highestOneBit(n));    }}[/BanUBB]
------解决方案--------------------
1. 方法一:
数学方法,正如二楼的朋友所说,最后剩下的就是比3000小的那个最大的2的多少次幂,即计算2的n次方小于3000这个方程
2. 方法二:
其实跟第一种方法差不多,就是把这个问题程序化,4楼的朋友说了
3. 方法三:
也是最笨、最原始的方法,就是从每次去掉的那些数一轮一轮的考虑
Java code
            public static void main(String[] argv) {        /**         * 有 1 到3000的数(1 2 3 4 .....)间隔1取出数据,把新得到的列再间隔1取出,依次循环下去,问最后得出的数是多少?         * 如第一次循环为(2 4 6 8 ....) 第2次为(4 8...) 最好写出代码.         */        int[] num = new int[3000];        // 赋值        for (int i = 0; i < 3000; i++) {            num[i] = i + 1;        }        for (int i = 0; i < 11; i++) {            for (int j = (int) (Math.pow(2, (double) i) - 1); j < 3000; j += (int) (Math.pow(2,                    (double) (i + 1)))) {                num[j] = 0;            }        }        for (int i = 0; i < 3000; i++) {            if (num[i] != 0)                System.out.println(num[i]);
------解决方案--------------------
第一轮,剩下的都是偶数,也就是2的倍数;
第二轮,剩下的都是4的倍数;
.
.
.
依次下去,最后的数一定是2的多少次幂。

应该有严谨的数学证明的,呵呵。
------解决方案--------------------
把这些数都化成二进制数,你就看出规律了:
第一轮是把最末位为1的数都去掉了;
第二轮是把倒数第2位为1的数都去掉了;
第三轮是把倒数第3位为1的数都去掉了;
以此类推;
最后剩下的当然是后面都是零,最高位是1的那个数了。
  相关解决方案