Столкнулся с проблемой больших чисел. Вспомнил про банковскую арифметику, которую когда-то реализовывали на строках, написал сложение и умножение (проверял на 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>
|
|