[剑指Offer] 48.不用加减乘除做加法

题目描述

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

【思路】

首先看十进制是如何做的: 5+7=12,三步走
第一步:相加各位的值,不算进位,得到2。
第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果。
第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12。

同样我们可以用三步走的方式计算二进制值相加: 5-101,7-111
第一步:相加各位的值,不算进位,得到010,二进制每位相加就相当于各位做异或操作,101^111。
第二步:计算进位值,得到1010,相当于各位做与操作得到101,再向左移一位得到1010,(101&111)<<1。
第三步重复上述两步, 各位相加 010^1010=1000,进位值为100=(010&1010)<<1。

继续重复上述两步:1000^100 = 1100,进位值为0,跳出循环,1100为最终结果。

 1 class Solution {
 2 public:
 3     int Add(int num1, int num2)
 4     {
 5         while(num2 != 0){
 6             int temp = num1^num2;//相加各位的值,不算进位
 7             num2 = (num1&num2)<<1;//计算进位值
 8             num1 = temp;
 9         }
10         return num1;
11     }
12 };
时间: 2024-10-12 01:09:54

[剑指Offer] 48.不用加减乘除做加法的相关文章

【剑指offer】不用加减乘除做加法

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27966641 题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入为两个整数m和n(1<=m,n<=1000000). 输出: 对应每个测试案例,输出m+n的值. 样例输入: 3 4 7 9 样例输出: 7 16 思路: 1.先将各bit位相加,不计进位,这一步可以用m^n实现 2.加上进位

剑指offer (47) 不用加减乘除做加法

题目:求两个整数之和,要求不得使用 加减乘除四则运算 题解分析:加减乘除都不能用,还要进行各种运算,必然想到 位运算 十进制加法: 5 + 17 = 22 step1. 各位相加,不考虑进位,即舍弃进位,结果为 12 (5 + 7 = 12舍弃进位) step2. 做进位 (5 + 7 = 12 > 9 有进位) 进位为10 step3. 两步结果相加 12 + 10 = 22 二进制加法:5 + 17 = 22 即 101 + 10001 step1. 各位相加,不考虑进位,即舍弃进位,结果为

剑指Offer之不用加减乘除做加法

题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 解题思路 求两个数的和在不能使用加减乘除的条件下,可以使用位运算.位运算是针对二进制的,我们以5和17这两个数字为例.5的二进制是101,17的二进制是10001.我们把计算分成三步:第一步各位相加但不计进位,得到的结果是10100(最后一位两个数都是1,相加的结果是二进制的10.这一步不计进位,因此结果仍是0):第二步记下进位.在这个例子中只在最后一位相加时产生一个进位,结果是二进制的10:第三步是把前两

《剑指offer》不用加减乘除做加法

[ 声明:版权所有,转载请标明出处,请勿用于商业用途.  联系信箱:[email protected]] 题目链接:http://www.nowcoder.com/practice/59ac416b4b944300b617d4f7f111b215?rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 思路 题目

剑指offer42:不用加减乘除做加法

分析: (1)十进制加法分三步:(以5+17=22为例) 1. 只做各位相加不进位,此时相加结果为12(个位数5和7相加不进位是2,十位数0和1相加结果是1): 2. 做进位,5+7中有进位,进位的值是10: 3. 将前面两个结果相加,12+10=22 (2)这三步同样适用于二进制位运算 1.不考虑进位对每一位相加.0加0.1加1结果都是0,0加1.1加0结果都是1.这和异或运算一样: 2.考虑进位,0加0.0加1.1加0都不产生进位,只有1加1向前产生一个进位.可看成是先做位与运算,然后向左移

剑指offer-47:不用加减乘除做加法

参考:https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html <原码,反码,补码 详解> 题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 解题思路 不能使用加减乘除,我的第一反应就是使用 位运算 和 二进制字符串判断 .二进制字符串从末尾到首位一位位判断,也是能得出结果的,但是代码太长,判断多种情况,太麻烦了.这并不是一个聪明的方法,舍弃了. 另一种方法是位运算.一

剑指offer系列——48.不用加减乘除做加法

Q:写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. T: 1.使用进制. 两个数异或:相当于每一位相加,而不考虑进位: 两个数相与,并左移一位:相当于求得进位: 将上述两步的结果相加 首先看十进制是如何做的: 5+7=12,三步走 第一步:相加各位的值,不算进位,得到2. 第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果. 第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12. 同样我们可以用三步走的方

48不用加减乘除做加法

题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 利用位运算 1.2个数异或,相当于每一位相加,不考虑进位 2.2个数相与并左移一位,相当于 求进位 循环把1,2 两个步骤的结果相加,直到进位为0 1 public class Solution { 2 public int Add(int num1,int num2) { 3 int sum = 0; 4 if(num2==0) sum =num1; 5 while(num2!=0){ 6 sum = n

48.不用加减乘除做加法(python)

题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. java public class Solution { public int Add(int num1,int num2) { while (num2!=0) { int temp = num1^num2; num2 = (num1&num2)<<1; num1 = temp; } return num1; } } python 1 class Solution: 2 def Add(self,