阿里2014年9月笔试中的一个算法设计题--擦黑板剩余数字
2013-09-28 10:22
369 查看
5、在黑板上写下50个数字:1至50.在接下来的49轮操作中,每次做如下动作:选取两个黑板上的数字a和b,擦去,在黑板上写|b - a|。请问最后一次动作之后剩下数字可能是什么?为什么?
题目参见:擦黑板剩余数字
当时写这道题目的时候并没有明显的思路,后来感觉应该用归纳法进行分析,但还没有理出来一个思路,程序写出来测试了下,3000次测试结果,剩下的都是奇数。
即,可能生下从1-50范围内的任意奇数
代码如下:
该为结果找个有说服力的理论~~~
update(@2013-11-1)偶尔看到恩格尔的《解决问题的策略》(参考链接),刚翻几页就看到这个题目了,解释很简单,使用的是“不变量原理“。更一般的表述如下:
正整数n是奇数,在黑板上写下来1-2n,然后任意取两个数a,b,擦去这两个数并写上|a-b|,证明:最后留下的是一个奇数。
解:设S为黑板上所有数字的和,开始时S=n(2n+1),是个奇数,每一步使S减少2min(a,b),它是个偶数,所以S的奇偶性是个不变量,在整个简化过程中总有S≡1(mod 2),所以最后结果是个奇数。
题目参见:擦黑板剩余数字
当时写这道题目的时候并没有明显的思路,后来感觉应该用归纳法进行分析,但还没有理出来一个思路,程序写出来测试了下,3000次测试结果,剩下的都是奇数。
即,可能生下从1-50范围内的任意奇数
代码如下:
HashSet<int> hsr = new HashSet<int>(); int[] result; int flag = 3000; int count = flag; string inStr; int inNum; Console.WriteLine("请输入试验次数:"); inStr=Console.ReadLine(); if (int.TryParse(inStr,out inNum)) { flag= flag > inNum ? flag : inNum; count = flag; while (flag > 0) { ArrayList hs = new ArrayList(); for (int i = 1; i <= 50; i++) { hs.Add(i); } int hsCount; Random rand = new Random(); for (int j = 0; j < 49; j++) { int r1, r2, delta; int e1, e2; hsCount = hs.Count; r1 = rand.Next(0, hsCount); e1 = (int)hs[r1]; hs.RemoveAt(r1); hsCount = hs.Count; r2 = rand.Next(0, hsCount); e2 = (int)hs[r2]; hs.RemoveAt(r2); delta = Math.Abs(e2 - e1); hs.Add(delta); } if (hs.Count > 0) { Console.Write("第{0:d3}次试验:", flag); foreach (int e in hs) { Console.Write("{0:d2}", e); if (!hsr.Contains(e)) { hsr.Add(e); } } } flag -= 1; Thread.Sleep(10); Console.WriteLine(); } result = (int[])hsr.ToArray(); Array.Sort(result); Console.WriteLine("{0:d4}次试验结果:", count); for (int k = 0; k < result.Length; k++) { if (!k.Equals(result.Length - 1)) { Console.Write("{0:d2},", result[k]); } else { Console.Write("{0:d2}", result[k]); } } } else { Console.WriteLine("请输入正确的整数!"); Environment.Exit(0); }
该为结果找个有说服力的理论~~~
update(@2013-11-1)偶尔看到恩格尔的《解决问题的策略》(参考链接),刚翻几页就看到这个题目了,解释很简单,使用的是“不变量原理“。更一般的表述如下:
正整数n是奇数,在黑板上写下来1-2n,然后任意取两个数a,b,擦去这两个数并写上|a-b|,证明:最后留下的是一个奇数。
解:设S为黑板上所有数字的和,开始时S=n(2n+1),是个奇数,每一步使S减少2min(a,b),它是个偶数,所以S的奇偶性是个不变量,在整个简化过程中总有S≡1(mod 2),所以最后结果是个奇数。
相关文章推荐
- 如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算)
- 设计一个在一百万个数字中求十个最大的数算法
- 阿里2015笔试附加题-一个数组中存在一组数字,其中有一个数字重复3遍,其他2遍,在O(1)空间找到那个重复3次的数
- 程序员面试金典——解题总结: 9.18高难度题 18.6设计一个算法,给定10亿数字,找出最小的100万个数字。假定计算机内存足以容纳全部10亿个数字。
- 笔试题&面试题:设计一个复杂度为n的算法找到单向链表倒数第m个元素
- (最优解)阿里笔试题请设计一个算法,在满足质因数仅为3,5,7或其组合的数中,找出第K大的数。比如K=1,2,3时,分别应返回3,5,7。要求算法时间复杂度最优。
- 1、在一个由自然数1-1000中某些数字所组成的数组中,每个数字可能出现零次或者多次。设计一个算法,找出出现次数最多的数字。
- PTA 求链式线性表的倒数第K项 给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。
- python学习:设计一个算法将缺失的数字找出来。
- 如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算
- 对于一个n位正整数a,去掉其中任意k(k<=n)个数字后,剩下的数字按原次序排列可以组成一个新的正整数。设计一个删数算法,使得剩下的数字组成的正整数最小。例如,a=13243221,k=5,输出:12
- 设计一个算法,要求在20个数字中(0到19)随机选取十个数字,但是这十个数字不能重复(用C语言或者OC实现)
- 笔试题&面试题:设计一个复杂度为n的算法找到单向链表倒数第m个元素
- 一个排列数字的算法笔试题
- 陈利人 面试题 对于一个n位正整数a,去掉其中任意k(k<=n)个数字后,剩下的数字按原次序排列可以组成一个新的正整数。设计一个删数算法,使得剩下的数字组成的正整数最小。
- JavaScript实现的一个计算数字步数的算法分享
- 设计一个复杂度为n的算法找到链表倒数第m个元素,最后一个元素假定是倒数第0个
- 对一个罗马数字与阿拉伯数字转换算法的分析
- 请设计一个算法,计算n的阶乘有多少个尾随零。 给定一个int n,请返回n的阶乘的尾零个数。保证n为正整数
- 输入阿拉伯数字(整数),输出相应的中文(美团网2014年9月16日笔试题目之中的一个)