前言: 这道题也很有意思,要求两个数的和,竟然还不能使用加法,这是什么鬼操作!!!想了好久好久,最后还是借鉴了别人思想,才找到了解决方案。自己在这方面看来了解的还是
前言:
这道题也很有意思,要求两个数的和,竟然还不能使用加法,这是什么鬼操作!!!想了好久好久,最后还是借鉴了别人思想,才找到了解决方案。自己在这方面看来了解的还是欠缺呀。慢慢查缺补漏吧!!!!
题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
解题思路
我们先来分析一下十进制如何做加法的吧!
例如:8+13;
第一步我们先做各位相加不进位,此时相加结果为11和1。第二步做进位,8+13坐进位,进位的值是10;第三步把前面两个结果加起来。所以我们就得到了最后的结果21。
看到了这个我接着思考,加减乘除不能用,那么只能使用位运算了。位运算是在二进制中使用的,那么就来分析一下二进制计算。
5的二进制是101,17的二进制是10001。还是分成三部来进行计算。第一步各位相加但是不计进位,得到结果是10100(最后一位两个数都是1,相加的结果是二进制的10,这一步不计进位,因此结果仍然是0)。第二步进行进位,这个例子中最后一位产生进位,结果是二进制的10;第三步把前两步的结果相加,得到的结果是 10110,转换成十进制正好是22。
根据以上的分析,我们可以看出第一步不进位的运算,实际上就是异或的结果。第二步进位的结果其实就是两个数做与运算,然后进行左移,根据这两个结论,接可以得出这个题目的答案了。
代码样例
package com.asong.leetcode.Doaddition;/**
* 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
*/
public class Solution {
public static void main(String[] args) {
System.out.println(Add(2,3));
}
public static int Add(int num1,int num2) {
int sum = 0;
int carry = 0;
do{
sum = num1 ^ num2;
carry = (num1 & num2) << 1;
num1 = sum;
num2 = carry;
}while (num2!=0);
return num1;
}
}