选举方法是让150名同学排成一排,由第一名开始报数,报奇数的同学落选退出队列,报偶数的同学站在位置不动,然
思路。 159个人,79个在偶数位,80个在奇数位。 奇数位除去,剩79人。 这79人每人的序号都是当前的序号乘2。 有39个偶数位,40个奇数位。 除掉奇数位。这里的奇数位,都能被2整除,偶数位都能被4整除。 那么现在剩下的就是4 8 12 16 20。。。。。156 39个数 继续。19个“偶数”,20个“奇数”,除去。 剩下8的倍数。8 16 24 32 40。。。。。。152 19个数 继续。 9个,10个,除去。 剩下16的倍数,16 32 48 64 80。。。。。。144 9个 继续。4,5,除去。 剩32的...全部
思路。 159个人,79个在偶数位,80个在奇数位。 奇数位除去,剩79人。 这79人每人的序号都是当前的序号乘2。 有39个偶数位,40个奇数位。 除掉奇数位。这里的奇数位,都能被2整除,偶数位都能被4整除。
那么现在剩下的就是4 8 12 16 20。。。。。156 39个数 继续。19个“偶数”,20个“奇数”,除去。 剩下8的倍数。8 16 24 32 40。。。。。。152 19个数 继续。
9个,10个,除去。 剩下16的倍数,16 32 48 64 80。。。。。。144 9个 继续。4,5,除去。 剩32的倍数。 32 64 96 128 剩4个了。 再除去1 3 位。
剩64 128 于是,答案128。 这个问题其实想一想比较浅显的。 奇数个数,第一次除去所有奇数,必然剩下奇数个偶数。 剩下的偶数顺次填补奇数的位置,于是,偶数位的新位置就都是原先位置的二分之一位置。
现在重复这个步骤,还是上述的原则,那么新的剩下的数还是第一次位置被降成二分之一的偶数。那么当前这次又降了二分之一的位置,合起来是四分之一了。 想必楼主你也发现了,按照这个原则,每次删除奇数位,剩下的数的位置一定都会缩减二分之一,那么最终没被删的那个数的位置缩减了多少,显而易见,删除了n次,就缩减了二分之一的n次方。
那么最后那个没删的数的位置是多少?不用想,肯定是第一位。 那么 为了好理解 我们可以设x没被删。 于是 x * (1/2)^n = 1 解出来 x = 2^n 现在问题变成了,159里有多少个2?这样说可能不够确切,通俗的讲就是 159能被二分多少次? 答案一定是比159小,且离159最近的那个2的幂。
于是 128出现了。楼主同样可以试试,159除以2 保留整数,一直除,一定是7次。 答案是128。 这是大脑想的 一边想一边敲进来了,个人认为应该是对的。 如果楼主实在想验证又懒得手动,Hi我,我写个程序模拟一下。
哎,我可能患强迫症了。写了个程序,验证了我的想法。 模拟人脑一点一点划的话,程序比较麻烦,于是我就先删13579,删2 6 10,这样一直来。 代码如下,C语言和C 混合代码,C 忘得差不多了,就这样吧。
#include int main(void) { int a[200]; for(int i=1 ; i a[i] = i; int b = 2; while(true) { for(int i=1 ; i if(a[i] % b != 0) a[i] = 0; b = b * 2; int t = 0; for(int i=1 ; i if(a[i] != 0) t ; if(t == 1) break; } for(int i=1 ; i if(a[i] != 0) printf("%d" , i); getchar(); getchar(); return 0; }。
收起