日期:2014-05-20  浏览次数:20831 次

求最后个数的方法
有 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的那个数了。