精简的大数运算

来源:互联网 发布:淘宝足球竞猜 编辑:程序博客网 时间:2024/05/22 18:05

前天听说有数竞的人在算100!(100的阶乘),很好奇于是写了个在浏览器上运行的大数运算器:

<html><head><title>Big number calculator</title></head><body><script type="text/javascript">function bigAdd(_str1,_str2){var _num1 = new Array(); _num1 = _str1.split(",");var _num2 = new Array(); _num2 = _str2.split(",");var i;var err;var c = 0;var _ans = new Array();for(i=0;i<4096;i++){_num1[i] = parseInt(_num1[i]);_num2[i] = parseInt(_num2[i]);}for(i=0;i<4096;i++){if((_num1[i] + _num2[i] + c)<10){_ans.push(_num1[i] + _num2[i] + c);c = 0;}else if(i != 4095){_ans.push(_num1[i] + _num2[i] + c - 10);c = 1;}else{alert("Data overflow!");return err;}}return _ans.toString(",");}function bigMul(_str1,_str2){var _num2 = new Array(); _num2 = _str2.split(",");var i, j, k, l;var err;var c = 0;var _ans = "";var _temp = "";var _tempa = new Array();for(i=0;i<4096;i++){_num2[i] = parseInt(_num2[i]);_ans = _ans + "0,";_temp = _temp + "0,";}if(_num2[0] != 0){for(k=0;k<_num2[0];k++){_ans = bigAdd(_ans,_str1);}}else{}for(i=1;i<4096;i++){if(_num2[i] != 0){for(k=0;k<_num2[i];k++){_temp = bigAdd(_temp,_str1);}_tempa = _temp.split(",");for(j=0;j<i;j++){_tempa.unshift("0");}_ans = bigAdd(_ans,_tempa.toString(","));for(i=0;i<4096;i++){_temp = _temp + "0,";}}else{}}return _ans;}function bigSub(_str1,_str2){var _num1 = new Array(); _num1 = _str1.split(",");var _num2 = new Array(); _num2 = _str2.split(",");var i;var err;var c = 0;var _ans = new Array();for(i=0;i<4096;i++){_num1[i] = parseInt(_num1[i]);_num2[i] = parseInt(_num2[i]);}for(i=0;i<4096;i++){if((_num1[i] - _num2[i] - c)>=0){_ans.push(_num1[i] - _num2[i] - c);c = 0;}else if(i != 4095){_ans.push(_num1[i] - _num2[i] - c + 10);c = 1;}else{alert("Data overflow!");return err;}}return _ans.toString(",");}var _num1 = new Array();var _num2 = new Array();var _ansr = new Array();var _ans;var i, j, k;for(i=0;i<4096;i++){_num1.push(0);_num2.push(0);}_num1[0] = 1;_ans = _num1.toString(",");for(i=0;i<10;i++){for(j=0;j<10;j++){for(k=0;k<10;k++){if((k == 0)&&(j == 0)&&(i == 0)){}else{_num2[0] = i;_num2[1] = j;_num2[2] = k;_ans = bigMul(_ans,_num2.toString(","));}}}}var _ansr = _ans.split(",");for(i=4095;i>=0;i--){document.write(_ansr[i]);if((i/128)%1 == 0){document.write("<br>")}}</script></body></html>

写的不是很好,没有可变数长度,没什么优化过。JavaScript真心不怎么适合奇怪的数学计算。这个弱数据类型的常常会自己把num转为str,而且数组不能自由传递,要toString后再传递。这是999的阶乘:

00000000000000000000000000000000000000000000006360285082520783842418950601894896848602085373248219091661264544793623059048773177
10632813283789906011234549223871800619168477353174894549974490980833436605646931665275985359084716268540999025419245611419923113
79170314893451150788189700336894964923193398211608505295916203096432098934536233584478975682268847317088543111578439584455505288
61788583416241571736655676417974877964274079080739866237046597886926415522052308655592592663063407335428087927589878389676080332
12704166117307266134619383565596926212806789122937925726797943553888273192558214745822948839095441854709792699344765543421832695
85780089246165988356623519414775679765313690942906068049158993024073563176797057581802062868178241336353147127740730104082172299
16201411617779750567360140974476198230111515523849025543904913244302014828570299505087809531215225141402151126038465907996727272
07436626614676486011938013432589532435900073252670077322808671511000710006036594563598414690258229831949726896467982559576248450
48484482983024193531332422943745985254483736796667318603231974963028669373453232761756714586630798055439951024324882659164976512
95542569202137307539800227018111258419871986276738489597811588605604595554100578843356298692932533278033618632028925130161693865
37598107942013695440305580080986388946753178570778332448001670573240104525993045879324373089241066420650230030083632755310854769
53740587940996449616969663759569597683292707615084992062292740812299510065256468638654200800107505451206070090443442939965163818
78826455204364288000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

话说自从用了In-System Memory Content Editor后延时很难受,到处出问题。物竞也真是上天了,天体运动要人命///