18.1 不用加号 做加法

先异或求sum,然后求carry,二者的和就是结果,可使还是不能用加号,递归执行,直到b==0。因为每次carry都移位右边多出一个零,然后下一次&的时候必然后面会是0,所以每递归调用一次b后面就多一个零,直到b==0.

public class Solution {

    public static int add(int a, int b) {
        if (b == 0)
            return a;
        int sum = a ^ b;
        int carry = (a & b) << 1;

        return add(sum, carry);
    }

    public static void main(String[] args) {
        System.out.println(add(1, 3));
        System.out.println(add(1000, 5));

    }
}
时间: 2024-12-21 02:12:38

18.1 不用加号 做加法的相关文章

【剑指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.加上进位

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

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

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

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

剑指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. 各位相加,不考虑进位,即舍弃进位,结果为

剑指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

剑指Offer对答如流系列 - 不用加减乘除做加法

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

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:第三步是把前两