// 加法运算
function bcadd(a,b){
a+="",b+=""
var al=a.length-1,bl=b.length-1,r=[],i
if(al < bl){
a="0".repeat(bl-al)+a
al=bl
}else b="0".repeat(al-bl)+bfor(i=0;i<=al;i++) r[i]=1*a[i]+1*b[i]
for(i=al;i>0;i--){
if(r[i] > 9){
r[i] -= 10
r[i-1]++
}
}
return r.join("")
}
// 减法运算
function bcsub(a,b){
a+="",b+=""
var al=a.length,bl=b.length,r=[],s=""
if(al > bl) b="0".repeat(al-bl)+b
else if(al < bl || a < b){
a="0".repeat(bl-al)+a
al=bl
s=a,a=b,b=s,s="-"
}
for(i=0;i<al;i++) r[i]=1*a[i]-b[i]
for(i=al-1;i>0;i--){
if(r[i] < 0){
r[i] += 10
r[i-1]--
}
}
return s+r.join("").replace(/^0+/,"") || 0
}
// 乘法运算
function bcmul(a,b){
a+="",b+=""
var al=a.length,bl=b.length,l=al+bl-2,i,j,c=[]
for(i=0;i<=l;i++) c[i]=0
for(i=0;i<al;i++){
for(j=0;j<bl;j++) c[i+j] += 1*a[i] * b[j]
}
do{
if(l && c[l] > 9){
c[l-1] += Math.floor(c[l] / 10)
c[l] %= 10
}
}while(l-- > 1)
return c.join("").replace(/^0+/,"") || 0
}
// 除法运算(参数2最高16位)
function bcdiv(a,b){
a+=""if(a.length < 17) return Math.floor(1*a/b)
var l=(b+"").length,n=a.substr(0,l),i,r=[]
a=a.substr(l),b*=1,l=a.length
for(i=0;i<l;i++){
n += a[i]
r[i]=Math.floor(n/b)
n %= b
}
return r.join("")
}
// 求余运算(参数2最高16位)
function bcmod(a,b){
a+=""
if(a.length < 17) return 1*a % b
var i=-1,n=0,l=a.length-1
while(i++ < l) n=(1*a[i]+10*n) % b
return n
}
注:
1. 自然数字符串 转 数字,1*n 速度最快,且比自动转化快一倍
2. 以上方法均为 自然数(非负整数) 计算,返回的结果也是自然数。且所有参数的前面没有补0
3. js最多读取前16个整数位,如果更长,那么会自动转为近似值,且使17位之后的数都为0
4. 经过测试,以上方法均为效率目前最高