【分享】PHP int 超大溢出整数的 加减运算函数,如果有更好的方法欢迎探讨
PHP 溢出 加减运算 超大整数
分享一个溢出整数加减的运算函数,刚刚写的,对于溢出的整数可以用这个来进行加减运算。遗憾的几点是:
一代码太多;二只有加减运算,乘除取余都没有;
其实还有一个更简便的方式就是用SQL数据库的: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)
如果有更好的方法,请随时回帖或者发个信息给我。欢迎探讨。
/* 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';}
测试:
$a = '-12345678901234567890123456789';$b = '1';$c = bigintO($a,'+',$b);var_dump($a); var_dump($b); var_dump($c);exit();/*输出:string '-12345678901234567890123456789' (length=30)string '1' (length=1)string '-12345678901234567890123456788' (length=30)*/
回复讨论(解决方案)
php 已经提供了 BC 和 GMP 两个高精度数学运算函数库
bcadd ? Add two arbitrary precision numbersbccomp ? Compare two arbitrary precision numbersbcdiv ? 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_div_q ? Divide numbersgmp_div_qr ? Divide numbers and get quotient and remaindergmp_div_r ? Remainder of the division of numbersgmp_div ? 别名 gmp_div_qgmp_divexact ? Exact division 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_jacobi ? Jacobi symbolgmp_legendre ? Legendre 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

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

长URL(通常用关键字和跟踪参数都混乱)可以阻止访问者。 URL缩短脚本提供了解决方案,创建了简洁的链接,非常适合社交媒体和其他平台。 这些脚本对于单个网站很有价值

在Facebook在2012年通过Facebook备受瞩目的收购之后,Instagram采用了两套API供第三方使用。这些是Instagram Graph API和Instagram Basic Display API。作为开发人员建立一个需要信息的应用程序

Laravel使用其直观的闪存方法简化了处理临时会话数据。这非常适合在您的应用程序中显示简短的消息,警报或通知。 默认情况下,数据仅针对后续请求: $请求 -

这是有关用Laravel后端构建React应用程序的系列的第二个也是最后一部分。在该系列的第一部分中,我们使用Laravel为基本的产品上市应用程序创建了一个RESTFUL API。在本教程中,我们将成为开发人员

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显着减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

PHP客户端URL(curl)扩展是开发人员的强大工具,可以与远程服务器和REST API无缝交互。通过利用Libcurl(备受尊敬的多协议文件传输库),PHP curl促进了有效的执行

您是否想为客户最紧迫的问题提供实时的即时解决方案? 实时聊天使您可以与客户进行实时对话,并立即解决他们的问题。它允许您为您的自定义提供更快的服务

2025年的PHP景观调查调查了当前的PHP发展趋势。 它探讨了框架用法,部署方法和挑战,旨在为开发人员和企业提供见解。 该调查预计现代PHP Versio的增长
