寫乙個函式,求兩個整數之和,要求在函式體內不得使用+、-、*、/四則運算符號。
思路:
首先看十進位制是如何做的: 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。輸入描述 輸入乙個字串,包括數字字母符號,可以為空 解題思路 先將字串轉化為陣列,要將字...