PHP-字符串相乘

作者: 简单方式 | 来源:发表于2020-05-02 13:46 被阅读0次
    字符串相乘

    题意

    给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式

    示例1:

    输入: num1 = "2", num2 = "3"
    输出: "6"

    示例2:

    输入: num1 = "123", num2 = "456"
    输出: "56088"

    示例3:

    输入: num1 = "999999999", num2 = "999999999"
    输出: "999999998000000001"

    解题思路:

    模拟乘法公式进行计算

                     1     2     3
                 *         2     2
            -------------------------
                     2     4     6
               2     4     6
            -------------------------
               2     7     0     6
    
    

    代码

    class Solution
    {
        /**
         * @param String $num1
         * @param String $num2
         * @return String
         */
        public function multiply($num1, $num2)
        {
            if ($num1 == '0' || $num2 == '0') {
                return '0';
            }
    
            $strNum1 = $num1;
            $strNum2 = $num2;
    
            if (strlen($num1) < strlen($num2)) {
                $strNum1 = $num2;
                $strNum2 = $num1;
            }
    
            $size1  = strlen($strNum1) - 1;
            $size2  = strlen($strNum2) - 1;
            $sumArr = [];
            $k      = 0;
    
            //乘法公式计算
            for ($i = $size2; $i >= 0; $i--) {
                $q   = 0;
                $sum = ($k++ > 0) ? array_pad([], $k - 1, 0) : [];
                for ($j = $size1; $j >= 0; $j--) {
                    $num   = $strNum2{$i} * $strNum1{$j} +$q;
                    $c     = $num % 10;
                    $q     = ($c != $num) ? floor($num / 10) : 0;
                    $sum[] = $c;
                }
                if ($q != 0) {
                    $sum[] = $q;
                }
                $sumArr[] = $sum;
            }
    
            //加法公式计算
            $i   = 0;
            $q   = 0;
            $end = count($sum);
            $sum = [];
            while (1) {
                $num = 0;
                foreach ($sumArr as $item) {
                    $num += $item[$i];
                }
                $num = (($q != 0) ? $num + $q : $num);
                if ($i >= $end) {
                    ($q != 0) ? $sum[] = $q : null;
                    break;
                }
                $c     = $num % 10;
                $q     = ($c != $num) ? floor($num / 10) : 0;
                $sum[] = $c;
                $i++;
            }
            return join(array_reverse($sum), '');
        }
    }
    

    测试

    print_r((new Solution())->multiply('123', '22')); //输出:2706
    print_r((new Solution())->multiply('2', '3')); //输出:6
    print_r((new Solution())->multiply('123', '456')); //输出:56088
    print_r((new Solution())->multiply('999999999', '999999999')); //输出:999999998000000001
    

    相关文章

      网友评论

        本文标题:PHP-字符串相乘

        本文链接:https://www.haomeiwen.com/subject/lcjkghtx.html