zoukankan      html  css  js  c++  java
  • 大整数运算(javascript)(无除法)

    var i=0,len=0;
    var BigNum=function (s,sign){//+1为正,-1为负
                this.bn=typeof s=="string"?BigNum.big(s.replace('-','')):s;
                this.deal();//处理减法导致的前0
                this.s=(Object.prototype.toString.apply(s) === '[object Array]'?this.show():s).replace('-','');//不含符号
                this.sign=typeof s=="string"?(s.charAt(0)=='-'?-1:1):(sign==-1?-1:1);                  
            };
    BigNum.weight=100000000;//好像js的运算精确度知道16位
    BigNum.wLen=8;//BigNum.weight.toString().length;
    for(i=0,len=BigNum.wLen;i< len;i++)
    {
        BigNum["zero"+i]=(1<< i).toString(2).substr(1);//可以定义静态的,i可以到30,即32位,首位为符号位,30个0
    }
    BigNum.big=function(s){
    var len=BigNum.wLen,l=Math.ceil(s.length/len)-1,r=[],i=0;
        for(i=0;i< l;i++){
            r[i]=parseInt(s.substr(-1*(i+1)*len,len),10);
        }
        r[i]=parseInt(s.substr(0,s.length%len||len),10);
        return r;
    }
    BigNum.prototype.show=function() { 
        var bn=this.bn,l=bn.length-1,i=1,r=[];
        r[0]=""+bn[l];
        while(l--){
            r[++i]=BigNum["zero"+(BigNum.wLen-bn[l].toString().length)]+bn[l];
        }
        return this.sign==1?r.join(""):'-'+r.join("");
    };
    BigNum.prototype.deal=function() { 
        var i=this.bn.length;
        while(i--){
            if(this.bn[i]!=0||i==0) break;
        }
        this.bn.length=i+1;
    };
    BigNum.prototype.add=function(b){ 
        var r=[],a=this,an=a.bn,bn=b.bn,la=an.length,lb=bn.length,i=0,len=la>lb?la:lb,m=0,t=0;
        if(a.sign==b.sign){
            for(;i< len;i++){ 
                t=(an[i]||0)+(bn[i]||0)+m;
                r[i]=t%BigNum.weight;
                m=Math.floor(t/BigNum.weight);
            }
            if(m>0){
                r[i]=m;
            }
            return new BigNum(r,a.sign);
        }else{
            var m=this.compare(b);
            if(m==0){
                return new BigNum('0');
            }else{
                if(m<0){
                    la=lb,an=bn,bn=a.bn;
                }
                for(i=0;i< la;i++){
                    t=an[i]-(bn[i]||0)+t;
                    if(t>=0){
                        r[i]=t;
                        t=0;
                    }
                    else {r[i]=t+BigNum.weight;t=-1;}
                }
                return new BigNum(r,m>0?a.sign:b.sign);
            }
        }
    }
    BigNum.prototype.multi=function(b){
        var a=this,an=a.bn,la=an.length,bn=b.bn,lb=bn.length,c=[],t=[],r=[],m=0,n=0,i=0,j=0,l=la+lb-1;
        if(lb>la){
            an=bn,la=lb,bn=this.bn,lb=bn.length;
        }
        for(i=0;i< lb;i++){
            c=t[t.length]=[];
            for(j=0;j< la;j++){
                c[j]=an[j]*bn[i];
            }
        }
        for(n=0;n< l||m>0;n++){
            r[n]=m;
            for(i=0;i< lb&&i<=n;i++){
                j=n-i;
                if(j< la){
                    r[n]+=t[i][j];
                }
            }
            m=Math.floor(r[n]/BigNum.weight);
            r[n]%=BigNum.weight;
        }
        return new BigNum(r,this.sign*b.sign);
    }
    BigNum.prototype.compare=function(b){//绝对值的大小比较 return>0 a>b 
        var len=this.s.length,a=len-b.s.length,i=0,t=0;
        if(a!=0){
            return a;
        }
        for(;i< len;i++){
            t=this.s.charCodeAt(i)-b.s.charCodeAt(i);
            if(t!=0){
                return t;
            }
        }
        return 0;
    }
  • 相关阅读:
    vue使用百度统计埋点
    修改JAVA字节码
    由前序遍历和中序遍历构建二叉树-Python
    二叉树的最大深度-Python
    二叉树的层序遍历-Python
    判断是否是对称二叉搜索树
    什么是主动学习方法
    验证二叉搜索树-Python
    DevExpress如何汉化XAF
    python install 失败?
  • 原文地址:https://www.cnblogs.com/legu/p/1717804.html
Copyright © 2011-2022 走看看