有两个大数,如何求它们的和?

PHP 算法面试题
1
1
分享
推荐答案
展示答案

大数会超出int表示的范围,所以不能直接相加。如果安装了BCMath扩展,可以使用bcadd来计算。否则需要模拟手工计算加法。 代码如下 <?php echo big_add('9999999999999999', '25'), "\n"; echo bcadd('9999999999999999', '25'), "\n"; function big_add($num1, $num2) {     //用len1暂存num1的长度     $len1 = strlen($num1);     if (0 == $len1) {         //如果num1的长度为0,则num1为0,和为num2的值         return $num2;     }     //用len2暂存num2的长度     $len2 = strlen($num2);     if (0 == $len2) {         //如果num2的长度为0,则num2为0,和为num1的值         return $num1;     }     //取出较长的数字长度     $len = $len1 > $len2 ? $len1 : $len2;     //用result存储结果     $result = '';     //进位标志     $carry_flag = 0;     for ($i = $len - 1; $i >= 0; $i--) {         //保存每个位的加数和被加数         $add1 = $add2 = 0;         if ($len1 > 0) {             //如果还未取完num1,则取出当前位置的数字,并把游标前移             $add1 = $num1[--$len1];         }         if ($len2 > 0) {             //如果还未取完num2,则取出当前位置的数字,并把游标前移             $add2 = $num2[--$len2];             //每位都是num1和num2同一位置的数字之和加上进位         }         $tmp = $add1 + $add2 + $carry_flag;         if ($tmp >= 10) {             //判断加完之后的和,如果大于等于10,则取余数,并设置进位标志为1             $result = ($tmp - 10) . $result;             $carry_flag = 1;         } else {             //如果小于10,则取当前值,并设置进位标志为0             $result = $tmp . $result;             $carry_flag = 0;         }     }     if (1 == $carry_flag) {         //如果进位标志为1,则最高位为1,需要拼接上         $result = $carry_flag . $result;     }     return $result; }

答案已隐藏