两个超大数的相加

Posted 1994july

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两个超大数的相加相关的知识,希望对你有一定的参考价值。

两个超大数的相加,主要是判断进一的情况,另外int型有边界限制,所以转换成字符串型进行处理。

<?php

/**
 * @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<$common; $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<$headlen; $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, 这里的超大数默认为正整数,没有支持负数或浮点数,需要优化;

来源:http://www.1994july.club/

以上是关于两个超大数的相加的主要内容,如果未能解决你的问题,请参考以下文章

C++实现两个超大的字符数字相加的算法的代码

两个超大的数字相加

两个超大的数字相加

算法算法求出2个超大正数相加

超大字符串型整数相加的简单实现

shell实现两个数的相加