程序员面试题精选100题(55)-不用+、-、×、÷做加法

来源:互联网 发布:集体智慧编程 编辑:程序博客网 时间:2024/05/17 17:43
程序员面试题精选100题(55)-不用+、-、×、÷做加法

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/
例如,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;


原创粉丝点击