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

题目描述

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

样例

输入:num1 = 1 , num2 = 2

输出:3

解法

先对两数进行异或,求得相加不进位的结果。再循环对两数进行按位与运算,并左移一位,直至进位为 0。

public class Solution {
    public int Add(int num1,int num2) {
        while(num2!=0){
            int t = num1 ^ num2; //不进位相加
            num2 = (num1&num2) << 1; //计算进位值
            num1 = t;
        }
        return num1;
    }
}

详细思路:

示例:5+7

先看十进制是如何做的: 三步走

  1. 相加各位的值,不算进位,得到2。
  2. 计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果。
  3. 重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12。

同理我们可以用三步走的方式计算二进制值相加:

5->101,7->111

  1. 相加各位的值,不算进位,二进制每位相加就相当于各位做异或操作,101^111,得到010。
  2. 计算进位值,相当于各位做与操作得到101,再向左移一位得到1010,(101&111)<<1,得到1010。
  3. 重复上述两步, 各位相加 010^1010=1000,进位值为100=(010&1010)<<1。
    继续重复上述两步:1000^100 = 1100,进位值为0,跳出循环,1100为最终结果。

原文地址:https://www.cnblogs.com/lisen10/p/11345206.html

时间: 2024-11-03 05:44:09

剑指:不用加减乘除做加法的相关文章

剑指-不用加减乘除做加法

写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. class Solution { public: int Add(int num1, int num2) { int sum,carry; while (num2!=0) { int temp = num1^num2; num2 = (num1&num2)<<1; num1 = temp; } return num1; } }; 首先看十进制是如何做的: 5+7=12,三步走 第一步:相加各位的值,不算进位

【剑指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对答如流系列 - 不用加减乘除做加法

面试题65:不用加减乘除做加法 题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.×.÷四则运算符号. 问题分析 我们之前详细探讨了位运算 剑指Offer对答如流系列 - 二进制中 1 的个数,已经非常非常详细了. 这道题仅仅是让做加法,我们除此之外还是做了乘除与减法. 记不清的朋友可以回头看看. 这里象征性地做一次解答吧 问题解答 public int add(int num1,int num2) { while(num2!=0){ int sum=num1^num2; in

剑指Offer面试题47(Java版):不用加减乘除做加法

题目:写一个函数,求两个整数之和,要求在函数体内不得适用+,-,* ,./  四则运算符号 面试的时候被问道这个问题,首先我们分析人们是如何进行十进制的加法的,比如是如何得出5+17=22的结果的,实际上,我们可以分三步进行:第一步只做各位相加不进位,此时相加的结果是12,第二步做进位,5+7中有进位,进位的值为10:第三步,把前面的两个结果加起来12+10的结果是22,刚好5+17=22 我们一直在想,求两个树之和四则运算都不能用,还能用什么?对数字做运算,除了四则运算之外,也就只剩下位运算了

剑指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系列源码-不用加减乘除做加法

题目1507:不用加减乘除做加法 时间限制:1 秒内存限制:128 兆特殊判题:否提交:782解决:581 题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入为两个整数m和n(1<=m,n<=1000000). 输出: 对应每个测试案例,输出m+n的值. 样例输入: 3 4 7 9 样例输出: 7 16 解法:模拟二进制加 #include <iostream> #include&l

编程算法 - 不用加减乘除做加法 代码(C)

不用加减乘除做加法 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 写一个函数, 求两个整数之和, 要求在函数体内不得使用+, -, *, /四则运算符号. 不能使用运算符号, 使用位运算, 第一步异或运算选位, 第二步与运算进位. 代码: /* * main.cpp * * Created on: 2014.7.13 * Author: Spike */ #include <iostream> #include <list>

65. 不用加减乘除做加法

面试题65. 不用加减乘除做加法 写一个函数,求两个整数之和,要求在函数体内不得使用 “+”.“-”.“*”.“/” 四则运算符号. 示例: 输入: a = 1, b = 1 输出: 2 提示: a, b 均可能是负数或 0 结果不会溢出 32 位整数 class Solution { public int add(int a, int b) { while(a != 0){ int tem = a ^ b; a = (a & b) << 1; b = tem; } return b;

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

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