【11】不能使用四则运算求两个整数的和
2014-05-26 12:31
204 查看
题目:给定两个整数a和b,要求不能使用+、-、*、/四则运算求两个数的和
方案:1. 四则运算不能算的情况下,肯定只能借助位运算,所以应该考虑位运算
2. 假设两个数的二进制位00101 和 10001,两个数相加的过程就是
第一步:先把二进制的各位相加但不进位,10100;
第二步:记下进位,00010
第三步:把前两步的结果相加,得到10110
3. 分析上述三个过程发现
第一步实际上就是两个数的异或结果,0+0 = 0,0+1 = 1+0 = 1,1+1 = 0;
第二步进位就是两个数&的结果再左移一位:(00101 & 10001) << 1 = 00010
第三步是两数相加,和要求的一样可以递归进行,直到第二个数为0为止。
方案:1. 四则运算不能算的情况下,肯定只能借助位运算,所以应该考虑位运算
2. 假设两个数的二进制位00101 和 10001,两个数相加的过程就是
第一步:先把二进制的各位相加但不进位,10100;
第二步:记下进位,00010
第三步:把前两步的结果相加,得到10110
3. 分析上述三个过程发现
第一步实际上就是两个数的异或结果,0+0 = 0,0+1 = 1+0 = 1,1+1 = 0;
第二步进位就是两个数&的结果再左移一位:(00101 & 10001) << 1 = 00010
第三步是两数相加,和要求的一样可以递归进行,直到第二个数为0为止。
//循环求两个数的和 int GetSum(int num1, int num2){ while(num2 != 0){ int sum = num1^num2; int carry = (num1&num2)<<1; num1 = sum; num2 = carry; } return num1; } //递归求两个数的和 int GetSum(int num1, int num2){ if(num2 == 0){ return num1; } int sum = num1^num2; int carry = (num1&num2)<<1; return GetSum2(sum, carry); }
相关文章推荐
- 12_2求两个整数中的较小值,要求不能使用比较运算符, if-else, a>b?a:b, while for
- 算法--两种方法实现一个Add函数,让两个整数相加,但是不能使用+、-、*、/等四则运算符。
- [LeetCode-29] Divide Two Integers(两个整数相除,不能使用乘除取余算术符)
- java算法4~交换两个整数,不能使用任何额外的变量
- 比较两个整数的大小,不能使用 &quot;if&quot;, &quot;?:&quot;, &quot;switch&quot; 等
- 1.A+B问题 给出两个整数A和B, 求他们的和, 但不能使用 + 等数学运算符。
- 编写函数求两个整数 a 和 b 之间的较大值。要求不能使用if, while, switch, for, ?: 以及任何的比较语句
- 求两个大整数相乘的结果 不能使用BigInteger和long
- 给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。
- 题目:给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。
- 给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。
- 给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。
- lintcode 给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。
- 编写函数求两个整数 a 和 b 之间的较大值。要求不能使用if, while, switch, for, ?: 以及任何的比较语句
- 编写一个函数比较两个整数大小,但不能使用任何比较操作符
- 给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。
- 又来一题咯:求两个整数的之和,要求在函数体内不得使用+、-、×、÷、++、- -
- 写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷
- 写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷
- 使用与或运算完成两个整数的相加