Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > wer


Автор: NLspieler 14.2.2009, 17:17
Представляю вашему вниманию функцию, умножающую почти любые целые числа, почти любой длинны.

http://blsamler.110mb.com/a_mal_bbb.php?a=3119999999999991111111155555555111114&b=4511111111111111555555555555551111112222222222221111114444

Код

<?php
function a_mal_b ($a, $b)
{
    $a = (string) $a ;
    $b = (string) $b ;
    
    $size = strlen ($a) ;
    
    for ($n = 0; $n < $size; $n++)
    {
        $key = $size - 1 - $n ;
        $antwort[$n] = a_mal_bbb($a[$key], $b, $n) ;
    }
    
    $size = count ($antwort) ;
    
    for ($n = 0, $return = 0; $n < $size; $n++)
    {
        $return = plus ($return , $antwort[$n] ) ;
    }
    
    return $return ;
}

function a_mal_bbb ($a, $bbb, $nullen=0)
{
    $return = '' ;
    for ($n = 1 ; $n <= $nullen; $n++)
    {
        $return = $return . '0' ;
    }

    $size = strlen ($bbb) ;
    
    for ($n = 0; $n < $size; $n++)
    {
        $key = $size - 1 - $n ;
        $antwort[$n] = $bbb[$key] * $a ;
    }
    
    $a_size = count ($antwort) ;
    
    for ($n = 0; $n < $a_size; $n++)
    {
        $n_next = $n + 1 ;
        $otwet = floor ($antwort[$n] / 10) ;

        if ($otwet != 0)
        {
            $antwort[$n_next] = $antwort[$n_next] + $otwet ;
            $antwort[$n] = $antwort[$n] - (10 * $otwet) ;
        }
    }
    
    $b_size = count ($antwort) ;    
    
    for ($n = 0; $n < $b_size; $n++)
    {
        $return = $antwort[$n] . $return ;
    }
    
    return $return;
}

function plus ($a, $b)
{
    $a = (string) $a ;
    $b = (string) $b ;
    
    $a = back ($a) ;
    $b = back ($b) ;
    
    $max_size = max ( strlen($a), strlen($b) ) ;
    $return = '' ;
    $ym = 0 ;
    
    for ($n = 0; $n <= $max_size; $n++)
    {
        $antwort = $a[$n] + $b[$n] + $ym ;
        $ym = 0;
        if ($antwort > 9)
        {
            $antwort = $antwort - 10;
            $ym = 1 ;
        }
        $return = $antwort . $return ;
    }
    
    return $return ;
}

function back ($str)
{
    $size = strlen ($str) ;
    $return = '';
    
    for ($n = 0; $n < $size; $n++)
    {
        $return = $str[$n] . $return ;
    }
    
    return $return ;
}

?>

Автор: ksnk 14.2.2009, 17:31
http://php.net/bcmul?

Добавлено через 2 минуты и 16 секунд
В чуланах РНР толпятся слегка покрытые пылью велосипеды...

Автор: skyboy 14.2.2009, 17:47
http://ua2.php.net/manual/en/intro.gmp.php
похоже на bc smile

Автор: NLspieler 14.2.2009, 18:19
Создание своего велосипеда, повышает профессиональный уровень программиста.

bcmul() отлично работает!!!
Есть ли аналогичные функции для сложения, вычитания, деления, извлечения корня, возведения в степень?

Автор: ksnk 14.2.2009, 18:44
Ну, там-же в том-же мануале ;-)
Код

Table of Contents

bcadd — Add two arbitrary precision numbers
bccomp — Compare two arbitrary precision numbers
bcdiv — Divide two arbitrary precision numbers
bcmod — Get modulus of an arbitrary precision number
bcmul — Multiply two arbitrary precision number
bcpow — Raise an arbitrary precision number to another
bcpowmod — Raise an arbitrary precision number to another, reduced by a specified modulus
bcscale — Set default scale parameter for all bc math functions
bcsqrt — Get the square root of an arbitrary precision number
bcsub — Subtract one arbitrary precision number from another



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)