我們知道,實作加法需要使用運算符號,那麼不使用運算符號怎麼實現加法呢?今天小編就來介紹一下不使用加減乘除運算子實作加法的方法,有需要的可以參考一下。
寫一個函數,求兩個整數總和,要求在函數體內不得使用 「 」、「-」、「*」、「/」 四則運算符號。
範例:
输入: a = 1, b = 1 输出: 2
提示:
a, b 皆可能是負數或0結果不會溢位32 位元整數
##解題想法1
array_sum 函數程式碼class Solution { /** * 递归法 * @param Integer $a * @param Integer $b * @return Integer */ function add($a, $b) { // return bcadd($a, $b); // bc 系列函数 return array_sum([$a, $b]); }}
解題想法2 - 借助位元運算
這題位運算還是背下來吧,畢竟位元運算這種模擬加法用法基本上就這題,很容易就忘記。 。 。 。 。 ^ 亦或- 相當於 無進位的求和, 想像10進制下的模擬情況:(如:19 1 = 20;無進位求和就是10,而非20;因為它不管進位數情況)& 與- 相當於求 每位的進位數, 先看定義:1 & 1 = 1;1 & 0 = 0;0 & 0 = 0;即都為1 的時候才為1,正好可以模擬進位數的情況,還是想像10 進制下模擬情況:(9 1 = 10,如果是用& 的思路來處理,則9 1 得到的進位數為1,而不是10,所以要用 <<1 向左再移動一位,這樣就變成10 了);這樣公式就是:(a^b) ^ ((a&b)<<1) 即:每次無進位數求每次得到的進位數- 我們需要不斷重複這個過程,直到進位數為0為止;代碼class Solution { /** * 递归法 * @param Integer $a * @param Integer $b * @return Integer */ function add($a, $b) { if ($b == 0) { return $a; } return $this->add($a ^ $b, ($a & $b) << 1); } // 迭代法 // function add($a, $b) { // while ($b != 0) { // $temp = $a ^ $b; // $b = ($a & $b) << 1; // $a = $temp; // } // return $a; // }}
解題思路3 -一位一位的計算
原理等同於位元運算,只是手動位元運算的實作程式碼class Solution { /** * 此方法暂时只支持两个正数相加 * @param Integer $a * @param Integer $b * @return Integer */ function add($a, $b) { $a = "$a"; $b = "$b"; $lenA = strlen($a); $lenB = strlen($b); $res = ''; $flag = 0; // 进位标志 for ($i = $lenA - 1, $j = $lenB - 1; $i >= 0 || $j >= 0; $i--, $j--) { // 超出的位数用 0 表示 $itemA = ($i >= 0) ? $a[$i] : 0; $itemB = ($j >= 0) ? $b[$j] : 0; // 求位数和 $sum = (int)$itemA + (int)$itemB + $flag; // 是否进位 if ($sum >= 10) { $flag = 1; // 只可能为1 $sum = $sum - 10; } else { $flag = 0; } $res = $sum . $res; } // 处理最高位进位 return $flag > 0 ? $flag . $res : $res; }}
以上是PHP不使用加減乘除運算符號如何實現加法的詳細內容。更多資訊請關注PHP中文網其他相關文章!