程序员面试题精选100题(55)-不用+、-、×、÷做加法
来源:互联网 发布:集体智慧编程 编辑:程序博客网 时间:2024/05/17 17:43
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/
例如,5+17=22 首先,思考如何做十进制的加法.
1)各位相加,不进位:相加后,个位为2(相加不要考虑进位),十位为1,最后相加的结果是12;
2)有进位的,求进位值:个位中5+7有进位,然后左移一位,得到进位值是10;
3)将前面两个加起来:12+10=22,刚好5+17=22. 两数之和,不能用四则运算,那么只能用位运算.然而,位运算是针对二进制数.
那么我们就思考下如何做二进制的加法:(5的二进制是101,17的二进制是10001)
1)各位相加,不进位:得到的结果是10100(两个数的个位数都是1,相加不进位的结果是0);
2)有进位的,求进位值:个位中1+1有进位,进位值是10;
3)将前面两个加起来:10100+10=10110,没有产生进位,转化成十进制是22.
二进制的加法,用位运算来替代: 1)0+0=0,0+1=1,1+0=1,1+1=0.以上的运算结果,和“异或”运算(^)的结果是一样的; 2)0+0=0,0+1=0,1+0=0,1+1=1.以上的运算结果,和“按位与”运算(&)的结果是一样的.然后,将进位值向左移一位; 3)重复第一步和第二步,直到不产生进位.
代码为:
#include<iostream>
using namespace std;
int AddWithoutArithmetic(int num1, int num2)
{
if(num2 == 0)
return num1;
int sum = num1 ^ num2;
int carry = (num1 & num2)<<1;
return AddWithoutArithmetic(sum, carry);
}
int main()
{
int firstNum=5,seconfNum=13;
int sum=AddWithoutArithmetic(firstNum,seconfNum);
cout<<sum<<endl;
}
分析上述调用过程: firstNum=5,二进制表示为101,secondNum为13,二进制表示为1101.
第一次调用函数 AddWithoutArithmetic(5,13) sum=8(1000),carry=10(1010)
第二次调用函数 AddWithoutArithmetic(8,10) sum=2(10),carry=16(10000)
第三次调用函数 AddWithoutArithmetic(2,16) sum=18(10010),carry=0
第四次调用函数 AddWithoutArithmetic(18,0) return num1=18;
- 程序员面试题精选100题(55)-不用+、-、×、÷数字运算符做加法
- 程序员面试题精选100题(55)-不用+、-、×、÷数字运算符做加法
- 程序员面试题精选100题(55)-不用+、-、×、÷数字运算符做加法
- 程序员面试题精选100题(55)-不用+、-、×、÷数字运算符做加法
- 程序员面试题精选100题(55)-不用+、-、×、÷做加法
- 程序员面试题精选100题(55)-不用+、-、×、÷做加法
- 程序员面试题精选100题(55)-不用+、-、×、÷做加法[算法]
- 程序员面试题精选100题-不用+、-、×、÷做加法[算法]
- 剑指offer 面试题47:不用+、-、×、÷做加法 题解
- 面试题47:不用加减乘除做加法
- 面试题42:不用加减乘除做加法
- 面试题47:不用加减乘除做加法
- 面试题47:不用加减乘除做加法
- 面试题51:不用加减乘除做加法
- 面试题47:不用加减乘除做加法
- 面试题47:不用加减乘除做加法
- 【面试题47】不用加减乘除做加法
- 面试题47-不用加减乘除做加法
- MyEclipse 6.5 启动后出现“initializing java tooling(0%)” 后程序未响应解决
- 02 - 基本控件:按钮控件(Button、ImageButton、ToggleButton)
- MyEclipse 6.5启动在“Loading com.genuitec.eclipse.sqlexplorer”卡住解决
- mysql 的load data local infile命令
- android学习笔记之BroadcastReceiver应用详解
- 程序员面试题精选100题(55)-不用+、-、×、÷做加法
- MySQL修改字段默认值
- 读《AskForHelp——提问的智慧》感想
- POJ 3126解题报告
- MySQL修改字段允许为空
- C#序列化和反序列化 .
- 孙鑫vc++ 17 进程间通信(1)剪贴板
- 二叉树的创建,节点删除,节点增加
- oracle学习之三(多表查询)