2.8总结

看过一个acm高手的博客,说要总结常用模板练到写时不用想,今天结束基本算法大数(高精度)的学习,明天码题
2.8总结
转载大数模板,自己慢慢理解

#include <iostream>
#include <cstring>
#include <cstdio>
 
using namespace std;
 
const int base = 10000;//万进制所以是10000
const int width = 4;        //最大是9999四位数
const int N = 1000;        //最大数字是10000的1000次方
class dashu{
public:
    int ln;
    int v[N];
    dashu(int r = 0){
        int i;
        for(i=0;r>0;r/=base){
            v[i++]=r%base;
        }
        ln=i;
    }
    friend bool operator < (const dashu& a,const dashu& b);
    friend bool operator <= (const dashu& a,const dashu& b);
    friend dashu operator+ (const dashu& a,const dashu& b);
    friend dashu operator- (const dashu& a,const dashu& b);
    friend dashu operator* (const dashu& a,const dashu& b);
    friend dashu operator/ (const dashu& a,const dashu& b);
    friend void write(const dashu& v);
    friend int digit(const dashu& a);
    friend bool read(const dashu& b,char buf[]);
    dashu& operator = (const dashu& r){
        memcpy(this,&r,(r.ln+1)*sizeof(int));
        return *this;
    }
};
 
bool operator < (const dashu& a,const dashu& 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 dashu& a,const dashu& b)
{
    return !(b<a);
}
dashu operator+ (const dashu& a,const dashu& b){
    dashu res;
    int i,cy=0;
    for(i=0;i<a.ln||i<b.ln;i++){
        if(i<a.ln) cy+=a.v[i];
        if(i<b.ln) cy+=b.v[i];
        res.v[i]=cy%base;
        cy/=base;
    }
    if(cy){
        res.ln=i+1;
        res.v[res.ln-1]=cy;
    }
    else
        res.ln=i;
    return res;
}
dashu operator -(const dashu &a,const dashu& b){
    dashu res;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;
}
dashu operator * (const dashu& a,const dashu& b){
    dashu res;res.ln=0;
    if(0==b.ln) { res.v[0]=0;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;
}
dashu operator /(const dashu& a,const dashu& b){
    dashu mod,tem,res;
    int i,lf,rg,mid;
    mod.v[0]=mod.ln=0;
    for(i=a.ln-1;i>=0;i--){
        mod=mod*base+a.v[i];
        for(lf = 0,rg=base-1;lf<rg;){
            mid=(lf+rg+1)/2;
            if(b*mid<=mod) lf=mid;
            else rg=mid-1;
        }
        res.v[i]=lf;
        mod=mod-b*dashu(lf);
    }
    res.ln=a.ln;
    int t=0;
    while(res.ln>0&&res.v[res.ln-1]==0)
        res.ln--;
    for(int i=0;i<res.ln;i++)
        res.v[i]=res.v[i+t];
    return res;
    //return mod;
}
int digit(dashu &a){
    if(a.ln==0) return 0;
    int l=(a.ln-1)*4;
    for(int t=a.v[a.ln-1]; t ;l++,t/=10);
    return l;
}
bool read(dashu& b,char buf[]){//将字符串数组变为大数
    cin>>buf;
    int ln=strlen(buf);
    memset(&b,0,sizeof(dashu));
    b.ln=ln/4+1;
    int t=0;
    for(int i=ln-1;i>=0;i=i-4){
        int n=0;
        int j=i-3;
        if(j<0){
            j=0;
        }
        while(j<=i){
            n=n*10+(buf[j++]-'0');
        }
        b.v[t++]=n;
    }
    return 1;
}
void write(const dashu& v){ //输出大数
    int i;
    printf("%d",v.ln==0?0:v.v[v.ln-1]);
    for(i=v.ln-2;i>=0;i--)
        printf("%04d",v.v[i]);
    cout<<endl;
}
int main()
{
    dashu a,b,c;
    a.ln=1;
    a.v[0]=1;
    b.ln=2;
    b.v[0]=1111;
    b.v[1]=1;
    c=a+b;
    write(a);
    write(b);
    write(c);
    return 0;
}


转载自https://blog.****.net/qq_30346729/article/details/77851964

刷过一章网课,今天结束卷积神经网络的网课
2.8总结
2.8总结
2.8总结
2.8总结

感觉看多了理论不练没用,看得多做得少,还是从基础题开始慢慢做。明天刷十道基础题,立个flag。