题解 | #不用加减乘除做加法#

不用加减乘除做加法

http://www.nowcoder.com/practice/59ac416b4b944300b617d4f7f111b215

1. python 解法: 核心思想 无进位加法的结果 res = num1^num2, 有进位的结果 carry = (num1&num2)<<1。循环直到没有进位为止。
但是python与其他解法有区别,java c++ go等的int类型长度都是固定值,所以做num1^num2时已经把符号位(最高位,负数为1正数为0)给顺手计算好了,但是python的整数是没有固定位数的,所以每次计算完都要和0xffffffff进行&操作,来保证不会溢出,同时最后也要判断num
的正负。
# -*- coding:utf-8 -*-
class Solution:
    def Add(self, num1, num2):
        # write code here
        while num2:
            result = (num1 ^ num2) & 0xffffffff
            carry = ((num1 & num2) << 1) & 0xffffffff
            num1 = result
            num2 = carry
        if num1 <= 0x7fffffff:
            result = num1
        else:
            result = ~(num1^0xffffffff)
        return result

2.java解法:同python
public class Solution {
    public int Add(int num1,int num2) {
        int  res = 0;
        int carry = 0;
        while(num2 != 0){
            res = num1^num2;
            carry = (num1&num2)<<1;
            num1 = res;
            num2 = carry;
        }
        return num1;
    }
}

3.go解法:同python
package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 
 * @param num1 int整型 
 * @param num2 int整型 
 * @return int整型
*/
func Add( num1 int ,  num2 int ) int {
    // write code here
    res := 0
    carry := 0
    for num2 != 0{
        res = num1^num2
        carry = (num1&num2)<<1
        num1 = res
        num2 = carry
    }
    return num1
}



全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务