天天看點

LintCodeA + B 問題解決及筆記(C++)

描述

給出兩個整數 aa 和 bb , 求他們的和。

你不需要從輸入流讀入資料,隻需要根據

aplusb

的兩個參數a和b,計算他們的和并傳回就行。

說明

a和b都是 

32位

 整數麼?

  • 是的

我可以使用位運算符麼?

  • 當然可以

樣例

樣例 1:

輸入:  a = 1, b = 2
輸出: 3	
樣例解釋: 傳回a+b的結果.
           

當然直接return a+b,沒有什麼好說的,這裡借鑒了評論區筆記裡異或的方法實作。

這裡假設我們用到兩個數 0101 (5) , 0010(2)。

#include <iostream>
#include <iomanip>
#include <string.h>

using namespace std;
int main()
{
   
    int a = 0b0101; //用二進制指派前加 0b
    int b = 0b0010;
    cout<< (a ^ b) << endl;
    system("pause");
}
           

首先兩數完成異或的結果,0111(7),毫無争議,但存在一個問題,就是這裡我們給出的例子加法剛好沒有進位。

這裡我們重新賦個新值,0101(5)和 1010(10)

#include <iostream>
#include <iomanip>
#include <string.h>

using namespace std;
int main()
{
   
    int a = 0b0101; //用二進制指派前加 0b
    int b = 0b1010;
    cout<< (a ^ b) + ((a & b)<<1) << endl;
    system("pause");
}
           

由于這裡運算是 a 異或 b = 0011 ,a 與 b = 1000,後續運算不再存在進位了,兩數加法計算後得結果。但是在實際計算中,是否需要進位是需要我們不斷判斷的。

結合上面的思路,我們可以根據國小計算加法的思路,若有進位,一步步往前進,直到進位為0。

#include <iostream>
#include <iomanip>
#include <string.h>
int add(int a, int b);
using namespace std;
int main()
{
   
    int a = 10; //用二進制指派前加 0b
    int b = 12;
    cout<< add(12,10)<< endl;
    system("pause");
}

int add(int a, int b)
{
    int _a,_b;
    while (_b != 0)
    {
        _a = a ^ b;
        _b = (a & b) << 1;
        a = _a;
        b = _b;
        /* code */
    }
    return _a;
    
}
           

繼續閱讀