PHP大数字计算

<?php
	$a = "8945876459564612";
	$b = "612";
	
	function add_on_str($x,$y){
		$xArr = str_split($x,1);
		$yArr = str_split($y,1);
		$resultArr = [];
		$arrSub = count($xArr)-count($yArr);
		if($arrSub>0){
			for ($i = 0; $i < abs($arrSub); $i++) {
				array_unshift($yArr,"0");
			}
		}else{
			for ($i = 0; $i < abs($arrSub); $i++) {
				array_unshift($xArr,"0");
			}
		}
		$inc = 0;
		for ($i = count($xArr); $i>0 ; $i--) {
			$tempsum = intval($xArr[$i-1])+intval($yArr[$i-1])+$inc;
			if($tempsum>9){
				$inc = 1;
				array_unshift($resultArr,strval($tempsum%10));
			}else{
				$inc = 0;
				array_unshift($resultArr,strval($tempsum));
			}
		}
		if($inc==1){
			array_unshift($resultArr,"1");
		}
		return implode("",$resultArr);
	}
	
	function sub_on_str($x,$y){
		$xArr = str_split($x,1);
		$yArr = str_split($y,1);
		$resultArr = [];
		$arrSub = count($xArr)-count($yArr);
		if($arrSub>0){
			for ($i = 0; $i < abs($arrSub); $i++) {
				array_unshift($yArr,"0");
			}
		}else{
			for ($i = 0; $i < abs($arrSub); $i++) {
				array_unshift($xArr,"0");
			}
		}
		$bigArr = null;
		$smallArr = null;
		$sign = null;
		for ($i = 0; $i< count($xArr); $i++){
			if(intval($xArr[$i])<intval($yArr[$i])){
				$bigArr = $yArr;
				$smallArr = $xArr;
				$sign = "-";
				break;
			}elseif(intval($xArr[$i])>intval($yArr[$i])){
				$bigArr = $xArr;
				$smallArr = $yArr;
				break;
			}else{
				continue;
			}
		}
		if($bigArr == null){
			return "0";
		}
		$sub = 0;
		for ($i = count($bigArr); $i>0 ; $i--) {
			$tempsum = intval($bigArr[$i-1])-intval($smallArr[$i-1])-$sub;
			if($tempsum<0){
				$sub = 1;
				array_unshift($resultArr,strval($tempsum)+10);
			}else{
				$sub = 0;
				array_unshift($resultArr,strval($tempsum));
			}
		}
		for ($i=0;$i==0;) {
			if($resultArr[0]=="0"){
				array_shift($resultArr);
			}else{
				break;
			}
		}
		if($sign!=null){
			array_unshift($resultArr,$sign);
		}
		return implode("",$resultArr);
	}
	
	
	
	var_dump(add_on_str($a,$b)); //string(17) "8945876459565224"
	
	var_dump(sub_on_str($b,$a)); //string(18) "-8945876459564000"
?>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值