JavaScript的大数加法、乘法和乘方
June 2nd, 2009
这里用一个小技巧:|0默认转为数值并取整,因为p和q可能长度不同,有可能会出现p[i]或q[j]成为undefined,|0比parseInt更强,可以自动将undefined的值转为0,这样就不用判断p[i]或q[j]是否为数值了。
可以将/\d{1,N}/g改成N位一次运算,默认是4位一次。
- function bigNumMulti(a,b){
- var p = a.match(/\d{1,4}/g).reverse();
- var q = b.match(/\d{1,4}/g).reverse();
- var f1 = 0;
- var result = "0";
- for(var i = 0; i < p.length; i++){
- var f2 = 0;
- for(var j = 0; j < q.length; j++){
- var t = (p[i]|0)*(q[j]|0);
- t += new Array(f1+f2+1).join("0");
- result = bigNumAdd(result, t);
- f2 += q[j].length;
- }
- f1 += p[i].length;
- }
- return result;
- }
- function bigNumAdd(a,b){
- var m = a.split('').reverse();
- var n = b.split('').reverse();
- var ret = [];
- var s = 0;
- for(var i = 0; i < a.length || i < b.length; i++){
- var t = (m[i]|0) + (n[i]|0) + s;
- ret.push(t%10);
- s = (t/10)|0;
- }
- if(s){
- ret.push(s);
- }
- return ret.reverse().join('');
- }
- function bigNumPow(a,b){
- var ret = "1";
- for(var i = 0; i < b; i++){
- ret = bigNumMulti(ret,a.toString());
- }
- return ret;
- }
- document.write(bigNumPow(36,16));
大数运算?
把大数除以1000… (根据长度指定位数),计算完毕再反算回来 是不比循环逐位更来的快些?
很喜欢贵站,不知站长是否可以交换链接啊。已经添加好了您的链接。
本站名称:乐蜂网
希望能通过审核。谢谢!