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 協議》,轉載必須註明作者和本文連結