劍指offer 進製轉化

2022-09-08 13:15:13 字數 1734 閱讀 1631

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

思路:

首先看十進位制是如何做的: 5+7=12,三步走

第一步:相加各位的值,不算進製,得到2。

第二步:計算進製值,得到10. 如果這一步的進製值為0,那麼第一步得到的值就是最終結果。

第三步:重複上述兩步,只是相加的值變成上述兩步的得到的結果2和10,得到12。

同樣我們可以用三步走的方式計算二進位制值相加: 5-101,7-111

第一步:相加各位的值,不算進製,得到010,二進位制每位相加就相當於各位做異或操作,101^111。

第二步:計算進製值,得到1010,相當於各位做與操作得到101,再向左移一位得到1010,(101&111)<<1。

第三步重複上述兩步, 各位相加 010^1010=1000,進製值為100=(010&1010)<<1。

繼續重複上述兩步:1000^100 = 1100,進製值為0,跳出迴圈,1100為最終結果。

方案一:

class solution 

return num1;

}};

方案二:

class solution 

};

當然尾遞迴一般可以化為方案一的迴圈形式。

更簡單的:

方案三:

class solution 

};

求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(a?b:c)。

先來看兩種奇特的解法:

方案一:

class solution 

};

方案二:

class solution 

};

哈哈這第二種解法真的是奇葩中的奇葩了。

方案一利用短路原理,當n=0時,不再遞迴,直接返回0;其餘的n值都需要遞迴求和,由於第二步的與操作並沒有改變n的值,所以該程式類似於:

if(n==0) ;

else n+=sum_solution(n-1);

return n;

當然方案二咋一看似乎是錯的:

littlebaby:

你不覺得你的**是錯誤的嗎?陣列大小必須是常量!

2016-06-18 11:47:24

然而對gcc來說是可以編譯的:

s向j前w衝

回覆 littlebaby:

2016-06-22 15:31:30

換個不認識我的id

回覆 s向j前w衝:這只是gcc的特性呀,標準c++並不支援的,比如vs就不能編譯的。

2016-07-11 19:22:14

顯然這種解法在n比較大時,空間是無法分配的。

參考:

進製轉換應用 劍指offer題型歸納

1.按位與 相同位的數字只要有0則位0。2.按位或 相同位的數字只要有1則位1 3.按位異或 相同位的數字不同則為1 相同則為0 4.左移 將運算數的二進位制整體左移指定位數,低位用0補齊,將乙個數左移一位擴大2倍,以此類推。5.右移 將運算數的二進位制整體右移指定位數,高位用0補齊,將乙個數右移一...

劍指offer 字串轉化成整數

題目 把乙個字串轉換成整數 分析 這個題目不難,難點在於輸入的判定,目標是,任何輸入都有正確的轉化值和返回值。測試會出現的問題有 1.空指標。返回值是0,status為0 2.區分空指標和 0 通過設定全域性變數來區分。0的返回值是0 status是1 3.非法輸入,除了正負號。返回值是0 stat...

劍指offer 將字串轉化為整數

題目描述 將乙個字串轉換成乙個整數 實現integer.valueof string 的功能,但是string不符合數字要求時返回0 要求不能使用字串轉換整數的庫函式。數值為0或者字串不是乙個合法的數值則返回0。輸入描述 輸入乙個字串,包括數字字母符號,可以為空 解題思路 先將字串轉化為陣列,要將字...