说明:防止超过长度限制,用字符串表示整形进行计算(不用数学库)。可以按照小学的时候方法进行计算。比如:314 + 45,乘法同样:

      3  1  4

    +    4  5

      3  5  9

<?php
function fadd($p1, $p2) {return $p1 + $p2;}
function fmul($p1, $p2) {return $p1 * $p2;}

function cel($p1, $p2, $oper = 'fadd')
{
    $p1 = str_split($p1); $p2 = str_split($p2);                     //初始化
    end($p1); end($p2);

    do {
        $digit = $oper(current($p1), current($p2));                 //这个函数做乘法的时候也可以用到
        $res = (substr($digit, -1, 1) + $over) . $res;              //个位 + 之前的进位
        $over = substr($digit, 0, strlen($digit) - 1);              //现在的进位
        prev($p1); prev($p2);
    } while((current($p1) !== false || current($p2) !== false) || $over);
    return $res;
}

function mul($p1, $p2)
{
    $p1 = str_split($p1); end($p1);                                 //初始化,把p1作为被乘数(下面的那个)
    $len = strlen($p2);
    do {
        $res[] = cel($p2, str_repeat(current($p1), $len), 'fmul');  //根据cel的逻辑  132*5 相当于cel(132, 555, 'fmul')
    } while(prev($p1) !== false);

    foreach ($res as $k => $v) {                                    //这里把res里的值都加一起,但要注意需要乘上10的$k次方(就是在字符串后面添加k个0)
        $count = cel($count, $v . str_repeat('0', $k));
    }
    return $count;
}

$p1 = '5462'; $p2 = '56';
echo cel($p1, $p2);         //相加:5518
echo mul($p1, $p2);         //相乘:305872
02-12 13:40