用php程序实现两个数的相加

实现两个数的相加,一般的做法很简单,直接相加即可,如

<?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] 这样设置,那么就会把他当作一个数组,所以就会出现 以上警告。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值