LintCode 1: 不用加法实现两个数相加

问题描述:

计算两个数a,b相加而不使用加法运算“a+b”:
问题描述

解题思路:

1、考虑普通两个十进制数相加:a=876, b=798。如果不考虑进位,则876+798=564
只考虑进位,则876+798相加的各个位的进位为1110(0表示进位到个位上的值,因为个位是最低的一位,没有后边的进位,故进位为0)。则1110+564=1674,正好是876+798=1674的正确结果。即我们可以分别计算出各位相加的不带进位的结果和只有进位的结果,将这两个数相加便是正确的答案。

2、再考虑二进制计算,1和0相加等于1,0和0或者1和1相加都等于0,如果不考虑最高位的进位,这正好与抑或运算(^)的结果一致。而各个位的进位则可以用 按位与的结果左移一位 表示出来(左移一位产生向个位的进位‘0’)。
例如二进制 1101 + 1011 = 11000,而1101 ^ 1011=0110, (1101 & 1011)<<1 = 10010,两者相加:10010 + 0110 = 11000. 结果正确。
再次强调:在最高位不产生进位时,抑或运算的结果与加法运算的结果相同。故当两个数相与的结果(即进位值)为0时,即 a & b =0,a^b 的结果便是正确的答案。故可运用循环或者递归,不断将a^b 与 (a ^ b)<<1 相加, 直到 a&b =0。代码示例如下。

示例代码:

# -*- coding: utf-8 -*-
# @Time    : 2018/9/2 13:06
# @Author  : stephen


def aplusb(a, b):
    if a == -b:                #当a = -b时 该方法效率不高,直接返回0
        return 0
    else:
        while b:
            a, b = a ^ b, (a & b) << 1
        return a


print(aplusb(2, 3))

版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/qq_38148754

猜你喜欢

转载自blog.csdn.net/qq_38148754/article/details/82315531