PHP两个大数相加问题

由于位数过多会出现溢出无法正常一位一位显示的问题,算法原理:定义大数为字符串,通过遍历从个位依次相加,判断是否大于10需要进位实现。

代码:

#!/usr/bin/php
<?php

error_reporting(E_ALL);

//两个大数相加,定义为字符串,整型太长会溢出
$a = '987654321098765432109876543210';
$b = '987654321098765432109876543210';

//取两个数长度
$lena = strlen($a);
$lenb = strlen($b);

//定义和
$sum = '';

//定义进位标志
$t = 0;

//循环(条件:从两个数末位开始遍历,直到最长的遍历完)
for( $i=$lena-1,$j=$lenb-1 ; ($i>=0 || $j>=0) ; $i--,$j-- ){
    //取相同位
    $aa = $i>=0 ? $a[$i] : 0;
    $bb = $j>=0 ? $b[$j] : 0;

    //相同位相加+进位
    $res = $aa+$bb+$t;

    //转为字符串
    $res = (string)$res;

    //比较是否大于10
    if($res < 10){
        //直接拼接即可
        $sum = $res.$sum;
        //进位标志为0
        $t = 0;
    }else{
        //取末位
        $sum = $res[1].$sum;
        //进位标志为1
        $t = 1;
    }    
}

//遍历完毕,判断进位是否存在,需加1
if($t == 1){
    $sum = (string)$t.$sum;
}

echo $sum.PHP_EOL;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值