程序员面试金典——解题总结: 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
- 程序员面试金典——解题总结: 9.17中等难题 17.4编写一个方法,找出两个数字中最大的那一个。不得使用if-else或其他比较运算符。
- 程序员面试金典——解题总结: 9.18高难度题 18.1编写一个函数,将两个数字相加。不得使用+或其他算术运算符。
- 程序员面试金典——解题总结: 9.17中等难题 17.9设计一个方法,找出任意指定单词在一本书中的出现频率
- 程序员面试金典——解题总结: 9.17中等难题 17.1编写一个函数,不用临时变量,直接交换两个数
- 程序员面试金典——解题总结: 9.17中等难题 17.12设计一个算法,找出数组中两数之和为指定值的所有整数对。
- 程序员面试金典——解题总结: 9.17中等难题 17.8给定一个整数数组(有正数有负数),找出总和最大的连续数列,并返回总和
- 程序员面试金典——解题总结: 9.17中等难题 17.11给定rand5(),实现一个方法rand7()。也就是,给定一个产生0到4(含)随机数的方法,编写一个产生0到6(含)随机数的方法
- 程序员面试金典——解题总结: 9.17中等难题 17.6给定一个整数数组,编写一个函数,找出索引m和n,只要将m和n之间的元素排好序,整个数组就是有序的。注意:n - m越小越好,也就是说,找出
- 程序员面试金典——解题总结: 9.17中等难题 17.5珠玑妙算游戏
- 程序员面试金典——解题总结: 9.17中等难题 17.14句子分割
- 程序员面试金典——解题总结: 9.17中等难题 17.3设计一个算法,算出n阶乘有多少个尾随0
- 程序员面试金典——解题总结: 9.17中等难题 17.2判断井字游戏中某个玩家是否赢了游戏
- 程序员面试金典——解题总结: 9.17中等难题 17.7给定一个整数,打印该整数的英文描述(例如 "One Thousand,Two Hundred-Thirty Four")
- 程序员面试金典——解题总结: 9.18高难度题 18.9随机生成一些数字并传入某个方法。编写一个程序,每当收到新数字时,找出并记录中位数。
- 程序员面试金典——解题总结: 9.18高难度题 18.4编写一个方法,数出0到n(含)中数字2出现了几次
- 程序员面试金典——解题总结: 9.17中等难题 17.13将二叉查找树转换为双向链表
- 程序员面试金典——解题总结: 9.18高难度题 18.7给定一组单词,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成。
- 程序员面试金典——解题总结: 9.18高难度题 18.12给定一个正整数和负整数组成的N*M矩阵,编写代码找出元素总和最大的子矩阵。
- 建议使用enum
- MFC DLL和Win32 DLL有什么区别?
- 将图片保存到系统相册
- 事物的四个隔离级别
- (0021)iOS 开发之-苹果官方文档
- 程序员面试金典——解题总结: 9.17中等难题 17.4编写一个方法,找出两个数字中最大的那一个。不得使用if-else或其他比较运算符。
- Android Studio接入Fabric- Crashlytics统计错误信息
- 视图
- github for windows
- nand flash地址机制
- include的坑
- 关于chm文件点击弹乱码(win7)
- 向量空间是用什么来表示
- hdu_2196 computer 树状dp经典入门题