PHP字串數字相加

bigbug發表於2022-01-28

php字串數字相加

int 型別有最大值限制,使用 string 來做數值相加,理論上不會出現資料溢位。

思路

  • 把字串轉換成陣列,然後反轉,如把 [1,2],變成[2, 1],迴圈計算的時候就能從【個位】開始計算。 因為 12 + 1,是先算 2 + 1,而不是 1 + 1;

  • 個位 + 個位 最終產生的結果最大也不過是 十位,最小還是個位,也就是 9 + 9 = 18, 1 + 1 = 2;

  • 用一個陣列來儲存計算出來的值,把計算出來的個位儲存陣列頭部,十位 保留到下次計算,也就是 19 + 2, 把 9 + 2 = 11 的 個位 儲存陣列 即 [1], 然後十位 在與 19 的十位相加 1 + 1 = 2,新增到陣列頭部 即 [2,1], 最後轉換為 字串 21.

程式碼實現

 /**
     * 數值字串相加
     * @param string $numOne 第一個數
     * @param string $numTwo 第二個數
     * @return string
     */
    public function numStrAdd(string $numOne, string $numTwo): string
    {
        $numOneArr = array_reverse((array)$numOne);
        $numTwoArr = array_reverse((array)$numTwo);
        if (count($numOneArr) < count($numTwoArr)) {
            $tempArr = $numOneArr;
            $numOneArr = $numTwoArr;
            $numTwoArr = $tempArr;
            unset($tempArr);
        }

        $newNumArr = [];
        $tempNum = 0;
        foreach ($numOneArr as $k => $v) {
            $needSumNumber = $numTwoArr[$k] ?? 0;
            $v += $needSumNumber;
            $v += $tempNum;
            $tempNum = 0;
            $v = (array)(string)$v;

            $needUnSiftNum = 0;
            if (count($v) > 1) {
                $tempNum = $v[0];
                $needUnSiftNum = $v[1];
            } else {
                $needUnSiftNum = $v[0];
            }
            array_unshift($newNumArr, $needUnSiftNum);
        }
        if ($tempNum > 0) {
            array_unshift($newNumArr, $tempNum);
        }
        return implode('',$newNumArr);
    }
本作品採用《CC 協議》,轉載必須註明作者和本文連結
Less is more.

相關文章