题解 | #不用加减乘除做加法#
不用加减乘除做加法
http://www.nowcoder.com/practice/59ac416b4b944300b617d4f7f111b215
题目描述
描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
解题思路
一般来说题目限定了不得使用+、-、*、/四则运算符号,都可以考虑使用位运算,那么接下来就是如何使用位运算,来计算两个值的和,和的计算,包括进位以及各个位相加,那么可以将其分为两部,首先求各个位置的和,不带进位,再求进位,再相加直到没有进位为0即可以得到两数和
非递归 时间复杂度 O(1) 空间复杂度O(1)
- ^ 可以用来求两个数的和(不带进位)
- & 可以用来求进位
// 时间复杂度 O(1) 空间复杂度O(1) public int Add(int num1,int num2) { // 当num2为0,表示没有进位,没有进位就表示计算完成 while (num2 != 0) { // 求和 int temp = num1 ^ num2; // 求进位 num2 = (num1 & num2) << 1; // 把两数和赋值给num1 num1 = temp; } return num1; }
举个例子
递归 时间复杂度 O(1) 空间复杂度O(1)
public int Add(int num1,int num2) { if(num2 == 0){ return num1; } return Add(num1^num2, (num1&num2)<<1); }