- 论坛徽章:
- 6
|
本帖最后由 cao627 于 2014-04-14 22:39 编辑
回复 34# Hadron74
123456789...... 源数据
*2*4*6*8*...... 第一轮
***4***8*...... 第二轮
可见 :
第1轮后剩下的数之间隔开1个*,剩下的最小的数之前有1个*
第2轮后剩下的数之间隔开3个*,剩下的最小的数之前有3个*
第3轮后剩下的数之间隔开7个*,剩下的最小的数之前有7个*
可概括为第n轮后剩下的数之间隔开2^n-1个*,剩下的最小的数之前有2^n-1*
于是第6轮后剩下的数之间隔开63个*,剩下的最小的数之前有63个*
63个*,然后是一个数64,然后再是63个*。127之内(当然更是100之内了)就剩下唯一的数64了
可见对于数列 [range(1,x)] x为一整数>1
经过n轮“枪杀”过后,侥幸剩下的数的最小数之前有2^n-1个*,如果2^n-1已经大于x的一半,那么数列中就只能剩下数2^n了。- >>> [2**i for i in range(1,101) if 101 > 2**i > 50 ]
复制代码 这样或更有效率: 用了网上查到的方法:用i & i-1 == 0 判断一个数是否为2的n次方,原理为2的整数次方(0次方除外)i的2进制结构中必然只有一位为1,与i-1进行&与运算必然为0- >>> [i for i in range(50,101) if i & i-1 == 0 ]
复制代码 |
|