面试题47:不用加减乘除做加法
提交网址: http://www.nowcoder.com/practice/59ac416b4b944300b617d4f7f111b215?tpId=13&tqId=11201
时间限制:1秒 空间限制:32768K 参与人数:2147
题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
分析:
此题属发散思维能力的题型。
看到的这个题目,我的第一反应是懵了,四则运算都不能用,那还能用什么呢?不过化为二进制数之后,用位运算 与&、或|、异或^、取反~可以派上用场。
递归实现 AC代码:
#include<cstdio> using namespace std; class Solution { public: int Add(int num1, int num2) { int sum, carry; sum=num1^num2; // 按位异或表示各位分别相加,不计入进位 carry = (num1 & num2) << 1; // carry用0、1来记录各bit的进位 if(num2==0) return num1; // 递归出口 return Add(sum, carry); } }; // 以下为测试 int main() { Solution sol; int res1 = sol.Add(3,6); int res2 = sol.Add(-5, 256); printf("%d\n", res1); printf("%d\n", res2); return 0; }
#include<cstdio> using namespace std; class Solution { public: int Add(int num1, int num2) { int sum, carry; while(num2 != 0) // 当被加数为0时,迭代找到了结束出口 { sum = num2 ^ num1; // 按位异或表示各位分别相加,不计入进位 carry = (num1 & num2) << 1; // carry用0、1来记录各bit的进位 num2 = carry; num1 = sum; } return num1; } }; // 以下为测试 int main() { Solution sol; int res1 = sol.Add(3,6); int res2 = sol.Add(-5, 256); printf("%d\n", res1); printf("%d\n", res2); return 0; }