ホームページ > バックエンド開発 > PHPチュートリアル > [Share] 大きなオーバーフロー整数に対する PHP int 加算および減算関数 より良い方法がある場合は、お気軽にご相談ください。

[Share] 大きなオーバーフロー整数に対する PHP int 加算および減算関数 より良い方法がある場合は、お気軽にご相談ください。

WBOY
リリース: 2016-06-23 14:20:11
オリジナル
953 人が閲覧しました

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 は 2 つの高精度数学演算関数ライブラリ 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
ログイン後にコピー
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート