实现两个数的相加,一般的做法很简单,直接相加即可,如
<?php
$a = 100;
$b = 200;
echo $a + $b; //打印300
但是如果数值的位数特别多,直接相加会造成内存溢出的情况下(虽然真实的场景不怎么会遇到), 我们可以通过程序来进行一位一位的相加,程序如下:
<?php
function getSum($a,$b){
if(!is_numeric($a) || !is_numeric($b)){
return false;
}
$lenA = strlen($a);
$lenB = strlen($b);
$aa = strrev($a); // 因为要从个位进行相加,所以先把数字反转一下
$bb = strrev($b);
$res = '';
$flag = 0; // 进位标志,如果两个数相加大于10,需要进位,那么把此
if($lenA > $lenB){
$high = $lenA;
$low = $lenB;
$rre = $aa;
}else{
$high = $lenB;
$low = $lenA;
$rre = $bb;
}
for($i=0; $i < $high; $i++){ //循环较长的那个数
if($i >= $low){ // 如果相加结束,把较长的那个数剩下的数放到 相加的和这个数的后面
$res[$i] = $rre[$i];
continue;
}
$sum = intval($aa[$i]) + intval($bb[$i]) + $flag; //这里如果不用intval( )转一下,会报 Warning: A non-numeric value encountered 的错误, 这只是在php7.1及以后的版本中会出现, 7.0及以前的版本不会出现
if($sum >= 10){
$res[$i] = $sum - 10;
$flag = 1;
}else{
$res[$i] = $sum;
$flag = 0;
}
}
return strrev($res);
}
$a = 111;
$b = 2226666623123213213213216666666;
echo getSum($a,$b); // 2.2266666231232E141
注意两点:
1、Warning: A non-numeric value
这个警告是由于 在使用(+ - * / ** % << >> | & ^) 运算时,例如a+b,如果a是开始一个数字值,但包含非数字字符(123a),b不是数字值开始时(b456),就会有A non-numeric value encountered警告。计算时,如果涉及到E运算,E是个字母,就可能会出现这个错误, 我们需要用 intval( )强制转为数值再进行计算。
这个警告在php7.0及以前的版本中,虽然不会出现,但是会导致错误运算,因为php的隐式转换,会忽略字母后面的数字值,如: $a = 123a; $b = E456; 那么$a+$b = 123 , 如果涉及到E运算,那么这个值是错误的。
2、strrev($res) Warning: strrev() expects parameter 1 to be string, array given
这个警告是在 php7.0及以前的版本会出现,这里的 $res 其实是一个数字字符串,因为字符串也可以像数组那样 $res[index] 去设置值,这个在php7.1及以后的版本是没有问题的,但是php7.0及之前的版本,如果 $res[index] 这样设置,那么就会把他当作一个数组,所以就会出现 以上警告。