題目:
題解:
代碼:
1. 代碼一:迭代
public class 面試題65 {
// 方法1:迭代
public static int add(int a, int b) {
int sum; // 無進位和
int carry; // 進位值
while(b != 0) // 當進位爲 0 時跳出
{
sum = a ^ b; // 異或操作得無進位和
carry = (a & b) << 1; // 與操作後,左移一位得進位值
// 循環,直到進位爲0
a = sum;
b = carry;
}
return a;
}
public static void main(String[] args) {
int a = 20, b = 17;
int res = add(a, b);
System.out.println(res);
}
}
2. 代碼二:遞歸
public class 面試題65 {
// 方法2:遞歸
public static int add(int a, int b) {
if(b == 0)
{
return a;
}
if(a == 0)
{
return b;
}
int plus1 = a ^ b; // 計算無進位和(不計進位). 相同位置0,相反位置1
int plus2 = (a & b) << 1; // 計算進位. 先保留同爲1的位,都爲1的位要向左進位,因此左移1位
return add(plus1, plus2);
}
public static void main(String[] args) {
int a = 20, b = 17;
int res = add(a, b);
System.out.println(res);
}
}