zoukankan      html  css  js  c++  java
  • 高精度运算

    View Code
    /*==================================================*\
    | 比较高效的大数
    | < , <= , + , - , * , / , %(修改/的最后一行可得)
    \*==================================================*/
    const int maxn = 1111; //最大长度
    const int base = 10000; //%04d
    struct bint {
        int ln, v[maxn];
        bint (int r) {
            memset(v,0,sizeof(v));  ln=0;
            if(r==0) {v[ln++]=0; return;}
            for(;r>0;r/=base) v[ln++]=r%base;
        }
        bint& operator=(const bint& r) {
            memcpy(this,&r,(r.ln+1)*sizeof(int));
            return *this;
        }
        void out() {
            printf("%d",v[ln-1]);for(int i=ln-2;i>=0;i--) printf("%04d",v[i]);printf("\n");
        }
    };
    bool operator<(const bint&a, const bint&b) {
        int i;
        if(a.ln!=b.ln) return a.ln<b.ln;
        for(i=a.ln-1; i>=0 && a.v[i]==b.v[i];i--);
        return i<0?0:a.v[i]<b.v[i];
    }
    bool operator<=(const bint&a, const bint&b) {
        return !(b<a);
    }
    bool operator==(const bint&x,const bint&y) {
        if(x.ln!=y.ln) return false;
        for(int i = x.ln-1;i >= 0; i--) {
                  if(x.v[i]!=y.v[i]) return false;
        }
        return true;
    } 
    bint operator+(const bint&a, const bint&b) {
        bint res(1); int i, cy=0;
        for(i=0;i<a.ln || i<b.ln || cy>0;i++) {
            if(i<a.ln) cy+=a.v[i];
            if(i<b.ln) cy+=b.v[i];
            res.v[i]=cy%base; cy/=base;
        }
        res.ln=i;
        return res;
    }
    
    bint operator-(const bint&a, const bint&b) {
        bint res(1); int i, cy = 0;
        for(res.ln=a.ln,i=0; i<res.ln; i++) {
            res.v[i]=a.v[i]-cy;
            if(i<b.ln) res.v[i]-=b.v[i];
            if(res.v[i]<0) cy=1, res.v[i]+=base;
            else cy=0;
        }
        while(res.ln>0 && res.v[res.ln-1]==0) res.ln--;
        return res;
    }
    bint operator*(const bint&a, const bint&b) {
        bint res(0); 
        if(0==b.ln) return res;
        int i, j, cy;
        for(i=0; i<a.ln; i++) {
            for(j=cy=0; j<b.ln || cy>0; j++, cy/=base) {
                if(j<b.ln) cy+=a.v[i] * b.v[j];
                if(i+j < res.ln) cy+=res.v[i + j];
                if(i+j >= res.ln) res.v[res.ln++]=cy%base;
                else res.v[i+j]=cy%base;
            }
        }
        return res;
    }
    bint operator/(const bint&a,int b) { // ! b != 0
        bint res(0), zero(0); int i, mod=0;
        res.ln = a.ln;
        for(i=a.ln-1; i>=0 ; i--) {
            mod=mod*base+a.v[i];
            res.v[i]=mod/b;
            mod%=b;
        }
        while(res.ln>0 && res.v[res.ln-1]==0) res.ln--;
        if(res.ln==0) res=zero;
        return res; // return mod相当于对b取余
    }
  • 相关阅读:
    net下开发COM+组件(一)
    C#中自定义属性的例子
    textBox的readonly=true
    关于ADO.Net的数据库连接池
    CYQ.Data 轻量数据层之路 使用篇三曲 MAction 取值赋值(十四)
    CYQ.Data 轻量数据层之路 SQLHelper 回头太难(八)
    CYQ.Data 轻量数据层之路 MDataTable 绑定性能优化之章(十一)
    C# 浅拷贝与深拷贝区别 解惑篇
    C#中的 ref 传进出的到底是什么 解惑篇
    CYQ.Data 轻量数据层之路 使用篇五曲 MProc 存储过程与SQL(十六)
  • 原文地址:https://www.cnblogs.com/zhang1107/p/3038540.html
Copyright © 2011-2022 走看看