PHP « Рассчитать точный факториал 100

Здравствуй, светлая голова решившая мне помочь.
Задача проста, рассчитать точный факториал 100!
Применил такой метод
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .php.geshi_code {font-family:monospace;} .php.geshi_code .imp {font-weight: bold; color: red;} .php.geshi_code .kw1 {color: #b1b100;} .php.geshi_code .kw2 {color: #000000; font-weight: bold;} .php.geshi_code .kw3 {color: #990000;} .php.geshi_code .co1 {color: #666666; font-style: italic;} .php.geshi_code .co2 {color: #666666; font-style: italic;} .php.geshi_code .co3 {color: #0000cc; font-style: italic;} .php.geshi_code .co4 {color: #009933; font-style: italic;} .php.geshi_code .coMULTI {color: #666666; font-style: italic;} .php.geshi_code .es0 {color: #000099; font-weight: bold;} .php.geshi_code .es1 {color: #000099; font-weight: bold;} .php.geshi_code .es2 {color: #660099; font-weight: bold;} .php.geshi_code .es3 {color: #660099; font-weight: bold;} .php.geshi_code .es4 {color: #006699; font-weight: bold;} .php.geshi_code .es5 {color: #006699; font-weight: bold; font-style: italic;} .php.geshi_code .es6 {color: #009933; font-weight: bold;} .php.geshi_code .es_h {color: #000099; font-weight: bold;} .php.geshi_code .br0 {color: #009900;} .php.geshi_code .sy0 {color: #339933;} .php.geshi_code .sy1 {color: #000000; font-weight: bold;} .php.geshi_code .st0 {color: #0000ff;} .php.geshi_code .st_h {color: #0000ff;} .php.geshi_code .nu0 {color: #cc66cc;} .php.geshi_code .nu8 {color: #208080;} .php.geshi_code .nu12 {color: #208080;} .php.geshi_code .nu19 {color:#800080;} .php.geshi_code .me1 {color: #004000;} .php.geshi_code .me2 {color: #004000;} .php.geshi_code .re0 {color: #000088;} .php.geshi_code span.xtra { display:block; }

function factorial($x) {
if ($x < 1) return 1;
else return $x*factorial($x-1);
}
echo factorial('100');
 

на выходе получил 9.3326215443944E+157
а как получить число нормального вида, в котором около 156 знаков?
Нашел на каком то форуме наводку на то что нужно использовать что то вроде умножения в столбик строковой переменной, но вот как этим воспользоваться не соображу.

1 ответов


bcmul() работает отлично

<?php
            $result = 0;
            $number = 1;
            for($i=1;$i<=100;$i++){
                $number = bcmul( $number, $i);
            }
            echo $number;

Используйте bcmul вместо *.
И попробуйте без рекурсии


   function factorial($x)
   {
    $res ="1";
     for ($i = 2;$i<($x+1); $i++)
     {
        $res = bcmul($res,"$i");
     }
     return $res;
   }
 

PHP не знаю, но проблема ваша в следующем. Число порядка 10^156 не влазит ни в один целочисленный тип. Поэтому результат, полученный вами - это float/double (уж не знаком я с системой типов PHP), т.е число с плавающей точкой. Это - не точное значение. И вывод sprintf("%f") вас не спасёт - он выведёт округленное значение, с точностью до первых 12-13 значащих цифр.
Для того, чтобы посчитать точно - вам нужно использовать так называемую "длинную арифметику". Я практически уверен, что вы без труда найдёте в Google готовые решения :)
PS точное значение 100! - это 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000.


Попробуйте sprintf()


echo sprintf('%f', factorial('100'));