[Share] PHPint super large overflow integer addition and subtraction operation function, if you have a better way to explore PHP overflow addition and subtraction operation super large integer
Share an operation function for adding or subtracting overflow integers. you can use this function to add or subtract overflow integers.
Unfortunately:
There is too much code; there is only addition and subtraction, and there is no multiplication and division remainder;
In fact, another easier way is to use the SQL database: SELECT n1 + n2;
mysql> SELECT 11234123413241341234123412341234+1;+------------------------------------+| 11234123413241341234123412341234+1 |+------------------------------------+| 11234123413241341234123412341235 |+------------------------------------+1 row in set (0.00 sec)mysql> SELECT 11234123413241341234123412341234*12341234123;+----------------------------------------------+| 11234123413241341234123412341234*12341234123 |+----------------------------------------------+| 138642947209487270472850788378836360727782 |+----------------------------------------------+1 row in set (0.00 sec)
If you have a better method, please reply or send me a message at any time. Welcome to explore.
/* big int operate [by fuzb 20130826] */function bigintO($num1,$op,$num2){ $arr = array(); $endop = ''; $num1o = $num1; $num2o = $num2; if($num1 < 0) { $c1 = -1; $num1 = preg_replace('/^(-)/','',$num1); } else { $c1 = 1; } if($num2 < 0) { $c2 = -1; $num2 = preg_replace('/^(-)/','',$num2); } else { $c2 = 1; } $len1 = strlen($num1); $len2 = strlen($num2); $len = max(strlen($num1),strlen($num2)); if($len1 < $len) $num1 = str_pad('0',$len - $len1).$num1; if($len2 < $len) $num2 = str_pad('0',$len - $len2).$num2; if($op == '+') { if($c1 == $c2) { $endop = $c1 > 0 ? '':'-'; } else { $endop = abs($num1o) > abs($num2o) ? $c1:$c2; $endop = $endop > 0 ? '':'-'; } $cc = $endop == '-' ? -1:1; for($i=0; $i< $len; $i++) { $n1 = intval($num1{$i}); $n2 = intval($num2{$i}); $n = $n1*$c1+$n2*$c2; $arr[$i] = $n*$cc; } } else if($op == '-') { if($c1 < 0) { $endop = $c2 > 0 ? '-':(abs($num1o) > abs($num2o) ? '-':''); } else { $endop = $c2 > 0 ? (abs($num1o) > abs($num2o) ? '':'-'):''; } $cc = $endop == '-' ? -1:1; for($i=0;$i < $len;$i++) { $n1 = intval($num1{$i}); $n2 = intval($num2{$i}); $n = $n1*$c1-$n2*$c2; $arr[$i] = $n*$cc; } } $len = count($arr); $arr2 = array(); for($i=0;$i< $len;$i++) { if($arr[$i] < 0) { $n = $arr[$i] + 10; $arr2[$i] = $n; $j = $i-1; while(true) { if($arr2[$j] == 0) { $arr2[$j] = 9; $j--; } else { $arr2[$j]--; break; } } } else if($arr[$i] > 9) { $n = $arr[$i] - 10; $arr2[$i] = $n; $j = $i-1; while(true) { if($arr2[$j] == 9) { $arr2[$j] = 0; $j--; } else { $arr2[$j]++; break; } } } else { $arr2[$i] = $arr[$i]; } } $value = $endop.preg_replace('/^(0{1,})/','',implode($arr2)); return strlen($value) > 0 ? $value : '0';}
Test:
$ A = '-12345678901234567890123456789'; $ B = '1'; $ c = bigintO ($ a, '+', $ B); var_dump ($ ); var_dump ($ B); var_dump ($ c); exit ();/* output: string '-12345678901234567890123456789' (length = 30) string '1' (length = 1) string '-12345678901234567890123456788' (length = 30 )*/
Reply to discussion (solution)
Php provides two high-precision mathematical operation libraries: BC and GMP.
bcadd ? Add two arbitrary precision numbersbccomp ? Compare two arbitrary precision numbersbcp ? Divide two arbitrary precision numbersbcmod ? Get modulus of an arbitrary precision numberbcmul ? Multiply two arbitrary precision numberbcpow ? Raise an arbitrary precision number to anotherbcpowmod ? Raise an arbitrary precision number to another, reduced by a specified modulusbcscale ? Set default scale parameter for all bc math functionsbcsqrt ? Get the square root of an arbitrary precision numberbcsub ? Subtract one arbitrary precision number from another
Gmp_abs? Absolute valuegmp_add? Add numbersgmp_and? Bitwise ANDgmp_clrbit? Clear bitgmp_cmp? Compare numbersgmp_com? Calculates one's complementgmp_p_q? Divide numbersgmp_p_qr? Divide numbers and get quotient and remaindergmp_p_r? Remainder of the pision of numbersgmp_p? Alias gmp_p_qgmp_pexact? Exact pision of numbersgmp_fact? Factorialgmp_gcd? Calculate GCDgmp_gcdext? Calculate GCD and multipliersgmp_hamdist? Hamming distancegmp_init? Create GMP numbergmp_intval? Convert GMP number to integergmp_invert? Inverse by modulogmp_bq? What is the best way to create a maxcompute project? Legendh symbolgmp_mod? Modulo operationgmp_mul? Multiply numbersgmp_neg? Negate numbergmp_nextprime? Find next prime numbergmp_or? Bitwise ORgmp_perfect_square? Perfect square checkgmp_popcount? Population countgmp_pow? Raise number into powergmp_powm? Raise number into power with modulogmp_prob_prime? Check if number is "probably prime" gmp_random? Random numbergmp_scan0? Scan for 0gmp_scan1? Scan for 1gmp_setbit? Set bitgmp_sign? Sign of numbergmp_sqrt? Calculate square rootgmp_sqrtrem? Square root with remaindergmp_strval? Convert GMP number to stringgmp_sub? Subtract numbersgmp_testbit? Tests if a bit is setgmp_xor? Bitwise XOR