程序员面试金典——解题总结: 9.17中等难题 17.4编写一个方法,找出两个数字中最大的那一个。不得使用if-else或其他比较运算符。

来源:互联网 发布:淘宝首页css代码 编辑:程序博客网 时间:2024/06/06 04:03
#include <iostream>#include <stdio.h>using namespace std;/*问题:编写一个方法,找出两个数字中最大的那一个。不得使用if-else或其他比较运算符。分析:这个好像就是T面试的一道题。首先明白大的数字有什么特点,大的数字= 两个数字的和 - 小的数字,较大的数字。我想起来了,      好像是用绝对值的做法来做的,构造差值。  令result = (|a+b| + |a-b|) / 2;  那么,如果a > b ,则有: result = a;符合要求输入:3 5 3 -5输出:53关键:1 一看到什么交换两个数,求两个数的较大值,就应该想到构造差值来做,或者用异或2 整数相加减,乘除要考虑溢出if 两个数符号不同,即 sign(a) ^ sign(b) = 1    if a > 0 , b < 0 , sign(a) = 1, else sign(a) = 0else,即 sign(a) ^ sign(b) = 0    if a > b ,sign(a - b) = 1else sign(a-b) = 0最终结果:a * k + b * q必须符合:a > b,k=1      符号不同:k = ( sign(a) ^ sign(b) ) * sign(a) + XOR( sign(a) ^ sign(b) ) * sign(a - b)                    相同:a < b, k=0      符号相同: q= XOR(k)3//与1异或处理,1返回0,0返回1;这个其实是取反的函数int XOR(int bit){return 1^bit;}//如果数字为正返回为1,否则返回0;采用右移31位和进行异或比较的方式int sign(int num){//只获取第32位符号位int bit = (num >> 31) & 0x1;int result = XOR(bit);return result;}*/bool isOverflow(int num){if( num > INT_MAX || num < INT_MIN ){return true;}else{return false;}}//与1异或处理,1返回0,0返回1;这个其实是取反的函数int XOR(int bit){return 1^bit;}//如果数字为正返回为1,否则返回0;采用右移31位和进行异或比较的方式int sign(int num){//只获取第32位符号位int bit = (num >> 31) & 0x1;int result = XOR(bit);return result;}/*获取较大的数if 两个数符号不同,即 sign(a) ^ sign(b) = 1    if a > 0 , b < 0 , sign(a) = 1, else sign(a) = 0else,即 sign(a) ^ sign(b) = 0    if a > b ,sign(a - b) = 1else sign(a-b) = 0最终结果:a * k + b * q必须符合:a > b,k=1      符号不同:k = ( sign(a) ^ sign(b) ) * sign(a) + XOR( sign(a) ^ sign(b) ) * sign(a - b)                    相同:a < b, k=0      符号相同: q= XOR(k)*/int getMaxNumber(int a , int b){int sign1 = sign(a);int k = ( sign(a) ^ sign(b) ) * sign(a) + XOR( sign(a) ^ sign(b) ) * sign(a - b);int q = XOR(k);int result = a * k + b * q;return result;}//这个方法的缺点:在于:有可能发生溢出int getBiggerNumber(int num1 , int num2){//如果不溢出int result;result = getMaxNumber(num1 , num2);/*if( !isOverflow(num1 + num2) && !isOverflow(num1 - num2) ){result = ( abs(num1 + num2) + abs(num1 - num2) ) / 2;}*/return result;}//为了不发生溢出void process(){int num1 , num2;while(cin >> num1 >> num2){int result = getBiggerNumber(num1 , num2);cout << result << endl;}}int main(int argc , char* argv[]){process();getchar();return 0;}

0 0
原创粉丝点击