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

#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
输出:
5
3
关键:
1 一看到什么交换两个数,求两个数的较大值,就应该想到构造差值来做,或者用异或
2 整数相加减,乘除要考虑溢出
if 两个数符号不同,即 sign(a) ^ sign(b) = 1
    if a > 0 , b < 0 , sign(a) = 1, 
	else sign(a) = 0
else,即 sign(a) ^ sign(b) = 0
    if a > b ,sign(a - b) = 1
	else 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值