Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Арифметика в строках. Большие числа. Область весьма специфична для JS 
:(
    Опции темы
magelan
Дата 26.9.2011, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


потерял xPath
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 5.4.2010

Репутация: нет
Всего: 16



Столкнулся с проблемой больших чисел.
Вспомнил про банковскую арифметику, которую когда-то реализовывали на строках, написал сложение и умножение (проверял на Pythone, работает).
Сразу заметно, как на MSIE 8 тормозят скрипты. Лидер по преобразованиям - Хром, хотя  думал, что Опера будет шустрее.

Код

<!DOCTYPE html>
<html>
<head>
<title>long number arifmetic</title>
    <script type="text/javascript">
        var addition = function( s1, s2 )
        {
            if( s1.length < s2.length )
            {
                var tmp = s2;
                s2 = s1;
                s1 = tmp;
            }
            var s = '';
            for( var i = 0; i < ( s1.length - s2.length ); i++ )
                s += '0';
                
            var a1 = s1.split( '' );
            var a2 = ( s + s2 ).split( '' );
            
            var r = [];
            var rlen = a1.length + 1;

            for( var k = 0; k < rlen; k++ )
                r[ k ] = 0;

            for( var i = a1.length - 1; i >= 0 ; i-- )
                r[ 1 + i ] += parseInt( a1[ i ]) + parseInt( a2[ i ]);   

            for( var k = rlen - 1; k > 0; k-- )
                if( r[ k ] >= 10 )
                {
                    r[ k - 1 ] += Math.floor( r[ k ] / 10 );
                    r[ k ] %= 10;
                }
            if( r[ 0 ] == 0 )
                delete r[ 0 ];

            return r.join( '' );    
        }
        var multiply = function( s1, s2 )
        {
            if( s1.length < s2.length )
            {
                var tmp = s2;
                s2 = s1;
                s1 = tmp;
            }
            var a1 = s1.split( '' );
            var a2 = s2.split( '' );
            var r = [];
            var rlen = a1.length + a2.length; 

            for( var k = 0; k < rlen; k++ )
                r[ k ] = 0;

            for( var j = 0; j < a2.length; j++ ) 
                for( var i = 0; i < a1.length; i++ )
                    r[ 1 + i + j ] += a1[ i ] * a2[ j ];   
        
            for( var k = rlen - 1; k > 0; k-- )
                if( r[ k ] >= 10 )
                {
                    r[ k - 1 ] += Math.floor( r[ k ] / 10 );
                    r[ k ] %= 10;
                }
            if( r[ 0 ] == 0 )
                delete r[ 0 ];

            return r.join( '' );    
        }
        var power = function( num, exp )
        {
             var r = num;
             
             for( var i = 1; i < exp; i++ )
                  r = multiply( r, num );
                  
             return r;
        }
        
        var factorial = function( n )
        {
            var f = '1';
            for( var i = 2; i < n; i++ )
                f = multiply( f, i.toString());

            return f;
        }
        
        var Lfibonachi = function( len )
        {
            var n1 = '0';
            var n2 = '1';
            var snum = '';
            var count = 1;
            do{
                snum = addition( n2, n1 );
                n1 = n2;
                n2 = snum;
                count++;    
            } while( snum.length < len );
            
            return snum;
        }
        
        var dt = new Date();
//        var f = Lfibonachi( 1000 );
        f = power( "999", "999" );
        document.write( '<font color="green">calc speed:' + (( new Date()).getTime() - dt.getTime()) / 1000+ '</font><br><br>' );            
        document.write( '<br>number length:' + f.length + '<br>number:' + f );
        
    </script>
</head>
<body>
</body>
</html>

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Здесь публикуют скрипты, которые уже проверены в обсуждениях других тем (при этом полезно поставить ссылки на все смежные обсуждения) или переносятся кем-либо из модераторов по просьбе участников, если видно, что в результате обсуждения темы был написан полезный или интересный скрипт. Третий возможный вариант - участник форума публикует скрипт, заведомо известный как полезный и эффективный, для, возможно, небольшой доработки и обсуждения.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Наши скрипты | Следующая тема »


 




[ Время генерации скрипта: 0.1290 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.