Arbitrary-precision arithmetic Explanation

后端 未结 8 1568
青春惊慌失措
青春惊慌失措 2020-11-22 11:10

I\'m trying to learn C and have come across the inability to work with REALLY big numbers (i.e., 100 digits, 1000 digits, etc.). I am aware that there exist libraries to do

相关标签:
8条回答
  • 2020-11-22 11:59

    One of the ultimate references (IMHO) is Knuth's TAOCP Volume II. It explains lots of algorithms for representing numbers and arithmetic operations on these representations.

    @Book{Knuth:taocp:2,
       author    = {Knuth, Donald E.},
       title     = {The Art of Computer Programming},
       volume    = {2: Seminumerical Algorithms, second edition},
       year      = {1981},
       publisher = {\Range{Addison}{Wesley}},
       isbn      = {0-201-03822-6},
    }
    
    0 讨论(0)
  • 2020-11-22 12:01

    Here's a simple ( naive ) example I did in PHP.

    I implemented "Add" and "Multiply" and used that for an exponent example.

    http://adevsoft.com/simple-php-arbitrary-precision-integer-big-num-example/

    Code snip

    // Add two big integers
    function ba($a, $b)
    {
        if( $a === "0" ) return $b;
        else if( $b === "0") return $a;
    
        $aa = str_split(strrev(strlen($a)>1?ltrim($a,"0"):$a), 9);
        $bb = str_split(strrev(strlen($b)>1?ltrim($b,"0"):$b), 9);
        $rr = Array();
    
        $maxC = max(Array(count($aa), count($bb)));
        $aa = array_pad(array_map("strrev", $aa),$maxC+1,"0");
        $bb = array_pad(array_map("strrev", $bb),$maxC+1,"0");
    
        for( $i=0; $i<=$maxC; $i++ )
        {
            $t = str_pad((string) ($aa[$i] + $bb[$i]), 9, "0", STR_PAD_LEFT);
    
            if( strlen($t) > 9 )
            {
                $aa[$i+1] = ba($aa[$i+1], substr($t,0,1));
                $t = substr($t, 1);
            }
    
            array_unshift($rr, $t);
         }
    
         return implode($rr);
    }
    
    0 讨论(0)
提交回复
热议问题