PHP中大整数相乘的2种实现方式
1、【通过调用BCMath实现】
PHP 为任意精度数学计算提供了二进制计算器(Binary Calculator),它支持任意大小和精度的数字,以字符串形式描述。
示例代码如下:
1 2 3 4 5 6 | <?PHP $op_left = '123456789123456789'; $op_right = '123456789123456789'; $rs = bcmul($op_left, $op_right); var_dump($rs); die(); |
2、【通过字符串数组相乘实现】
将乘数和被乘数分别按指定的位数存放到数组中,然后再模拟乘法,将结果加起来,最后在返回的时候针对不够位数的进行补0操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | <?PHP define('DEPTH', 10000); define('LEN', strlen(DEPTH) - 1); /** * 格式化数组元素,如果单个元素的值不够LEN的长度,前面补0 * @param string $input */ function item_format(&$input) { $input = str_pad($input, LEN, "0", STR_PAD_LEFT); } /** * 初始化相乘的字符串,将其转化成数组 * @param string $input 需要相乘的操作数 * @return array 已经分好块,并且逆转了的数组 */ function init_array($input) { $begin_len = strlen($input) % LEN; $a = array(); if ($begin_len > 0) { $a[0] = substr($input, 0, $begin_len); $input = substr($input, $begin_len); } $a = array_merge($a, str_split($input, LEN)); return array_reverse($a); } /** * 大整数相乘的数组实现 * @param string $left_operand 左边的操作数 * @param string $right_operand 右边的操作数 * @return string 相乘的结果 */ function mul($left_operand, $right_operand) { if (empty($left_operand) || empty($right_operand)) { return FALSE; } /* 初始化相乘的数组 */ $a = init_array($left_operand); $b = init_array($right_operand); $len_a = strlen($a); $len_b = strlen($b); for ($i = 0; $i < $len_a; $i++) { for ($j = 0; $j < $len_b; $j++) { $c[$i + $j] += $a[$i] * $b[$j]; if ($c[$i + $j] >= DEPTH) { // 进位操作 $c[$i + $j + 1] += floor($c[$i + $j] / DEPTH); $c[$i + $j] %= DEPTH; } } } $c = array_reverse($c); array_walk(&$c, 'item_format'); return ltrim(implode('', $c), '0'); } $left_operand = '123456789123456789'; $right_operand = '123456789123456789'; $rs = mul($left_operand, $right_operand); var_dump($rs); |
EOF