劍指Offer_程式設計題 不用加減乘除做加法
阿新 • • 發佈:2018-12-16
不用加減乘除做加法
時間限制:1秒 空間限制:32768K 熱度指數:81997
題目描述
寫一個函式,求兩個整數之和,要求在函式體內不得使用+、-、*、/四則運算子號。
首先,十進位制是如何計算加法:5+7=12
- 相加各位的值,不算進位,得到2
- 計算進位的值,得到10,如果進位為0,那麼第一步得到的值即為結果
- 重複上述兩步,相加的值變成10和2,結果為12
同樣以三步走的方式計算二進位制下的加法:5-101,7-111
- 相加各位的值,不算進位,得到010;二進位制相加就是每一位做異或操作:101^111
- 計算進位值,得到1010;相當於每一位做與操作,再左移一位:(101&111)>>1=1010
- 重複上述兩步,各位相加: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(); } }