大数字 大数值 溢位数值 加减运算 算法

未结帖
0 690
ajian admin_jim 2018-01-31
悬赏:5飞吻
<?php

  $a = "9999888877776666555544443333322222111110000000000000000000000000000";
  $b = "1000236540001";

  //计算两字符串长度,并获取最长字符串长度
  $a_len = mb_strlen($a);
  $b_len = mb_strlen($b);
  $a_len >= $b_len ? $total_len =$a_len:$total_len = $b_len;

  //将两串字符串补全到最长字符串长度,左边以字符串"0"补全
  $a_new = str_pad($a,$total_len,'0',STR_PAD_LEFT);
  $b_new = str_pad($b,$total_len,'0',STR_PAD_LEFT);

  //将两字符串 按照字符单元拆分,分别存储到对应的数组当中
  $a_str_array = array();
  $b_str_array = array();
  for($i=$total_len-1;$i>=0;$i--){
      $target_str_a = "";
      $target_str_b = "";
      $target_str_a = mb_substr($a_new,$i,1);

      $target_str_b = mb_substr($b_new,$i,1);
      $a_str_array[] = $target_str_a;
      $b_str_array[] = $target_str_b;
  }
  //如上循环可换做str_split()改写  例:$c_array= str_split("Shanghai",3)
 $new_combine_array = array();

 //循环上面的数组 按相同索引对应元素值进行数值加减运算(如果是减法法则需要从高位往低位运算,如果是加法则需要从低位往高位运算),并进行进位处理,然后将运算值存储到新的数组当中
 for($n=0;$n<=$total_len;$n++){
   $n_digit = intval($a_str_array[$n])+intval($b_str_array[$n]);
   if($n_digit>=10){
       //如果当前位两数值相加大于等于10 ,则需要进位,处理办法是任选一个之前的拆分数组$a_str_array 或 $b_str_array,将其第$n+1个元素加1(有可能使该元素值等于10)
       $n_digit = $n_digit-10;
           //$n_digit -= 10;
       $a_str_array[$n+1] = strval(intval($a_str_array[$n+1])+1);
   }
   $new_combine_array[$n] = $n_digit;
 }

 //将拆分运算后的数组进行拆分拼接
 $new_combine_str = "";
 $new_combine_array_length = count($new_combine_array);
 for($m=$new_combine_array_length-1;$m>=0;$m--){
     //判断最高位字符串是否为"0",若为"0"则不拼接
     $m ==$new_combine_array_length-1 && $new_combine_array[$new_combine_array_length-1]=="0"?$new_combine_str = $new_combine_str:$new_combine_str .= $new_combine_array[$m];
 }

echo $new_combine_str;


?>



方法二:

function big_number($num1,$num2){
  $num1 = rtrim($num1,"0");
  $num1 = rtrim($num1,".");
  $num2 = rtrim($num2,"0");
  $num2 = rtrim($num2,".");
  $len1 = strlen($num1);
  $len2 = strlen($num2);
  $diff1 =  $len1 - (strpos($num1,".")?:$len1);
  $diff2 =  $len2 - (strpos($num2,".")?:$len2);
  $char_index1 = strpos($num1,".")?:$len1;
  $char_index2 = strpos($num2,".")?:$len2;
  $diff = abs($diff1 - $diff2);
  $char_index = $diff1 > $diff2 ? $diff1 : $diff2;
  if($diff1 > $diff2){
     $num2 = str_pad($num2,$len2 + $diff,"0",STR_PAD_RIGHT);
  }else{
     $num1 = str_pad($num1,$len1 + $diff,"0",STR_PAD_RIGHT);
  }

  $num1 = str_replace(".","",$num1);
  $num2 = str_replace(".","",$num2);
  $len1 = strlen($num1);
  $len2 = strlen($num2);
  $len = $len1 > $len2 ? $len1 : $len2;
  $num1 = str_pad($num1,$len,"0",STR_PAD_LEFT);
  $num2 = str_pad($num2,$len,"0",STR_PAD_LEFT);
  $arr1 = str_split($num1);
  $arr2 = str_split($num2);
  $arr = [];
  $mod = 0;
  for($i = $len - 1;$i >= 0;$i--){
     $num = (int)$arr1[$i] + (int)$arr2[$i] + $mod;
     if($num >= 10){
        $num -= 10;
        $mod = 1;
     }else{
        $mod = 0;
     }
     array_unshift($arr,$num);
  }
  $num = implode("",$arr);
  if($char_index > 0){
     $num = substr($num,0,strlen($num) - $char_index + 1).".".substr($num,1 - $char_index);
     $num = rtrim($num,"0");
     $num = rtrim($num,".");
  }
  return $num;
}
$num1 = "1423547535454.34859347895";
$num2 = "543789538243290874093.545";
$num = big_number($num1,$num2);
echo $num;






热忱回答0


最近热帖

近期热议

  1. javascript——prototype与__proto 9
  2. Mysql 中出现的Data truncated for column 3
  3. 在nginx中使用x-sendfile的解决方案 3
  4. 高版本jQuery面插件实现Ajax上传图片 1
  5. Thinkphp Socket.class.php 类的使用 1
  6. 使用ionic3创建第一个App 0
  7. ios-oc html5 0
  8. nginx.conf 0
  9. 基于ionic3.4.0的项目搭建 0
  10. php 缩略图 0