今天在微信朋友圈里看到了这样一条信息:
100只狗排成一行,分别以1、2、3……编号,从这些狗中选出偶数号的杀掉,剩下的狗重新从1开始编号,然后再选偶数杀掉……如此循环直到只剩下1只狗为止。
请问这只狗要站在哪个位置才能保证存活时间最长(除了1号)?
起初,觉得这个很简单,在本子上随便傻瓜式的排列下,然后一个个排除就不行了嘛,然后又想了想,假如1000只,10000只呢???你这样傻瓜式是可以,但是,你这不是浪费时间吗?
然后,我就开始coding了,设想有100只狗,那么,我就把这100只狗放在数组里面,然后,再循环这个数组的长度,为偶数的不做处理,不为偶数的,我们放在一个临时的笼子里面,去除的时候,不可能只去除一次,所以,要do,while循环。
下面给大家展示两种写法,一个是C#的,一个是JS的
C#写法:
static void Main(string[] args) { //待去除狗的笼子 int[] dogs = new int[100]; //临时笼子 List<int> tempdogs = new List<int> { }; //100只狗,从1开始编号 for(int i=0;i<100;i++) { dogs[i] = i + 1; } //去除轮数 int kill = 0; do { kill++; for (int k = 0; k < dogs.Length; k++) { if ((k + 1) % 2 != 0) { tempdogs.Add(dogs[k]); } } dogs = tempdogs.ToArray(); tempdogs.Clear(); } while (dogs.Length > 2); { Console.WriteLine("截止到第"+kill+"轮,仍然存活的两只狗是:"+dogs[0]+","+dogs[1]); } }
结果:
js写法:
window.onload = function () { killdog(); } function killdog() { var arr = [];//临时笼子 var dogs = [];//100只现成的狗 for (var i = 0; i < 100; i++) { dogs[i] = i + 1; } do { for (var j = 0; j < dogs.length; j++) { //偶数的干掉 if ((j + 1) % 2 != 0) { arr.push(dogs[j]); } } dogs = arr;//把临时存储的再次放入狗笼子里面 arr = [];//必须清除之前被干掉的狗 } while (dogs.length > 2) { document.write("剩余狗的编号为:"+dogs); } }
结果为:
以上就是我个人写得两种方法,可能写得不是太好,如果哪位大神能有更好的写法或者逻辑更好的来展现,请大神多多赐教,贴出代码,大家一起讨论下,可以是java,php,C++也可以是其他语言,总之,你有什么好的写法,麻烦呈现下,大家一起学习嘛!
好了,今天闲来无事,就写到这,你还在等什么,开启电脑,写个呀