日期:2014-05-20 浏览次数:20831 次
[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. 方法三:
也是最笨、最原始的方法,就是从每次去掉的那些数一轮一轮的考虑
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的那个数了。