找出两个数中间比较大的

又是一道往年的面试题,题目是这样的:有两个变量a和b,不用”if”,”?;”,”switch”或者其它判断语句,找出两个数中间比较大的。

方法1:求平均值法

方法2:位移法

这两种方法都不错。

不用中间变量交换两个整数之我见

今天继续在研究面试宝典,其中有一道题,很耐人寻味。

题目:不用中间变量交换两个整数。

A方法. 首先我想到的方法就是做数学上的加减运算。其代码如下:

运行结果如下:

这个方式没有什么问题吧?

存在的缺陷:其实这个方式的交换是存在问题的,假设a和b的值都很大,那么a+b就有可能越界。当时我真的没有考虑到这个问题。

B方法:

其次,采用异或的方法,其代码如下:

运行结果:

这个方法,确实也可以实现两个数的交换,但是C语言书上也是有介绍的,但是这种方法也是存在缺陷的。

存在缺陷:假如,两个数是同一地址,都是上面的代码中的a[0],会出现什么情况呢?

详见代码:

运行结果:

a[0]置为了0,怎么样出现这个结果很差异吧。仔细分析,不难发现,这正是我们在swap_3里面用异或实现交换所造成的。如果输入a和b是同一个数,swap_3里面代码相当于:

成了a做了3次于自己的异或,其结果当然是0了。

既然这样,我们就不能够在任何使用交换的地方采用异或了,即使要用,也一定要在交换之前判断两个数是否已经相等了,如下:

总结:今天学到了很多的东西,小小的无中间变量交换整数的学问,原来如此之大。其实无中间变量交换两个整数的值的大小,这几种方法都或多过少,存在一些问题,就我个人而言,我觉得现在的计算机硬件的水平发展如此之快,如果因为节省几个字节,而造成哪怕万分之一的错误,我觉得都不是很值得。

输出源文件的标题,目前执行行的行数,编译时间

昨天苹苹让我看了我一道面试的试题,我觉得挺经典的,自己经常在使用,但是单独拿出来问,自己却还真的不知所措。

下面就以下的问题,我用代码实现一下。

输出源文件的标题,目前执行行的行数,编译的日期,编译的时间。

Linux下实现:

Windows下实现:

上面用Linux和Windows两种环境进行了测试,他们的函数还是有区别的,例如Wingdows下有 __TIMESTAMP__这个变量,而Linux下没有。还有__FILE__这个变量在Linux下的运行结果直接是文件名,而Windows下这个变量的结果为其具体的路径。

以上的这两个例子我觉得主要运用在对源文件的调试中,如果用户的程序在执行过程中出错,可以将这些出错信息通过E-mail发送给程序员,程序员能够迅速的定位代码的出错位置。