java两个很大的数相加_两个超大数的相加
兩個超大數的相加,主要是判斷進一的情況,另外int型有邊界限制,所以轉換成字符串型進行處理。
/**
* @description 兩個超大的數字相加
* @param $numA string 第一個大數
* @param $numB string 第二個大數
* @return string 兩個大數之和
**/
function largeNumberAdding(string $numA, string $numB) {
//邊界校驗
if (empty($numA)) {
if (empty($numB)) {
return '0';
} else {
return $numB;
}
} else {
if (empty($numB)) {
return $numA;
}
}
$result = $tmpRes = $head = $tmpHead = '';
$lenA = strlen($numA);
$lenB = strlen($numB);
$revA = strrev($numA);
$revB = strrev($numB);
$common = min($lenA, $lenB);
//截取超出部分長度
$tmpHead = ($lenA > $lenB) ? substr($revA, $common) : substr($revB, $common);
//是否進一
$addOne = false;
//重疊部分處理
for ($i=0; $i
$tmp = (int)$revA[$i] + (int)$revB[$i];
$addOne && $tmp += 1;
$tmpRes .= (string)($tmp % 10);
$addOne = ($tmp >= 10) ? true : false;
}
//頭部處理
if ($addOne) {
if ($tmpHead) {
$headlen = strlen($tmpHead);
for ($j=0; $j
$tmp = (int)$tmpHead[$j];
if ($addOne) {
$tmp += 1;
$tmpRes .= (string)($tmp % 10);
$addOne = ($tmp >= 10) ? true : false;
} else {
$tmpRes .= (string)$tmp;
}
}
}
//相同位數進一直接+1
$addOne && $tmpRes .= '1';
} else {
$tmpRes .= $tmpHead;
}
//將結果倒轉
$result = strrev($tmpRes);
return $result;
}
$a = '988881111111110000000000000000000';
$b = '10002222222222';
$res = largeNumberAdding($a, $b);
var_dump($res);
輸出結果:
string(33) "988881111111110000010002222222222"
時間復雜度: O(n)
思考:
1, 這里的超大數默認為正整數,沒有支持負數或浮點數,需要優化;
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的java两个很大的数相加_两个超大数的相加的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java问题的英语对话_一些表达拒绝的应
- 下一篇: java微妙_10个微妙的Java编码最