PHP字符串整形数字相加

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 协议》,转载必须注明作者和本文链接
莫等闲,白了少年头,空悲切
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
39
粉丝
13
喜欢
75
收藏
67
排名:294
访问:3.2 万
私信
所有博文
社区赞助商