题解 | #不用加减乘除做加法#
不用加减乘除做加法
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; } }
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 }