1. 程式人生 > >劍指Offer_程式設計題 不用加減乘除做加法

劍指Offer_程式設計題 不用加減乘除做加法

不用加減乘除做加法

時間限制:1秒 空間限制:32768K 熱度指數:81997

題目描述

寫一個函式,求兩個整數之和,要求在函式體內不得使用+、-、*、/四則運算子號。

首先,十進位制是如何計算加法:5+7=12

  1. 相加各位的值,不算進位,得到2
  2. 計算進位的值,得到10,如果進位為0,那麼第一步得到的值即為結果
  3. 重複上述兩步,相加的值變成10和2,結果為12

同樣以三步走的方式計算二進位制下的加法:5-101,7-111

  1. 相加各位的值,不算進位,得到010;二進位制相加就是每一位做異或操作:101^111
  2. 計算進位值,得到1010;相當於每一位做與操作,再左移一位:(101&111)>>1=1010
  3. 重複上述兩步,各位相加:010^1010=1000;進位值:(010&1010)>>1=100;繼續重複上述兩步,1000^100=1100,進位值為0,退出迴圈;結果為1100
import java.util.*;
public class Solution{
	public int Add(int num1,int num2) {
		while(num2!=0) {
			int temp=(num1^num2);
			num2=(num1&num2)<<1;
			num1=temp;
		}
		return num1;
	}
	
	public static void main(String[] args) {
		Scanner cin=new Scanner(System.in);
		Solution work=new Solution();
		while(cin.hasNext()) {
			int a=cin.nextInt();
			int b=cin.nextInt();
			System.out.println(work.Add(a,b));
		}
		cin.close();
	}
	
}

Java大數類

import java.util.*;
import java.math.*;
public class Solution{
	public int Add(int num1,int num2) {
		BigInteger a=BigInteger.valueOf(num1);
		BigInteger sum=a.add(BigInteger.valueOf(num2));
		return sum.intValue();
	}
	public static void main(String[] args) {
		Scanner cin=new Scanner(System.in);
		Solution work=new Solution();
		while(cin.hasNext()) {
			int a=cin.nextInt();
			int b=cin.nextInt();
			System.out.println(work.Add(a,b));
		}
		cin.close();
	}
}