高精模板

自己写的高精模板。
测试过这些题:
poj3378,poj2506,poj1001高精小数,poj1406,poj2389,poj1306,poj2325。

当然poj的坑爹数据,不保证是不是还有坑点。

不过好处是没有刻意缩行,意思比较明白,可以根据具体题目稍作修改或是扩展。

notice:
0.l保存位数,从0开始。s[maxl]保存每一位数字。
1.bsize 是一个位保存的大小,一般用10000或10。
bbit 对应为4或1。
bsav[]是做除法用的。
2.除法是-1000、-100、-10、-1倍这样来做的,复杂度还可以接受吧,最多是O(l1*l2*40)。
3.高精除int,高精乘int或longlong要注意溢出,不行就转为高精再做。
4.高精小数为了方便写,只写了一位的。bbit要设为1,bsize设为10。


看得顺眼的童鞋就拿去用吧~


#define maxl 260
#define bbit 4
#define bsize 10000

int bsav[10]={1,10,100,1000};

struct bign{
    int l,s[maxl];
    bign(){l=0;memset(s,0,sizeof(s));}
    void init(){l=0;memset(s,0,sizeof(s));}
    bign operator =(int a){
        this->init();
        while(a){s[l++]=a%bsize;a=a/bsize;}
        while(l&&s[l]==0) --l;
        return *this;
    }
    bign operator =(long long a){
        this->init();
        while(a){s[l++]=a%bsize;a=a/bsize;}
        while(l&&s[l]==0) --l;
        return *this;
    }
    bign operator =(char *a){
        this->init();
        int tmp,i,j,tl=strlen(a);
        for(i=tl-1;i>=bbit;i-=bbit){
            tmp=0;
            for(j=bbit-1;j>=0;--j){
                tmp=tmp*10+a[i-j]-'0';
            }
            s[l++]=tmp;
        }
        tmp=0;
        for(j=0;j<=i;++j){
            tmp=tmp*10+a[j]-'0';
        }
        s[l++]=tmp;
        while(l&&s[l]==0) --l;
        return *this;
    }

    bool operator ==(bign b){
        if (l!=b.l) return false;
        for(int i=l;i>=0;--i) if (s[i]!=b.s[i]) return false;
        return true;
    }

    bool operator <(bign b){
        if (l!=b.l) return l<b.l;
        for(int i=l;i>=0;--i) if (s[i]!=b.s[i]) return s[i]<b.s[i];
        return false;
    }

    bool operator !=(bign b){return !(*this==b);}
    bool operator <=(bign b){return *this<b||*this==b;}
    bool operator > (bign b){return b<*this;}
    bool operator >=(bign b){return b<*this||*this==b;}

    bign operator +(bign b){
        bign r;
        r.l=l>b.l?l:b.l;
        int i,c=0;
        for(i=0;i<=r.l;++i){
            r.s[i]=s[i]+b.s[i]+c;
            c=r.s[i]/bsize;
            r.s[i]%=bsize;
        }
        if (c) r.s[++r.l]=c;
        return r;
    }
    bign operator +(int b){bign r;r=b;return *this+r;}
    bign operator +=(bign b){return *this=*this+b;}
    bign operator +=(int b){return *this=*this+b;}


    bign operator -(bign b){
        bign r;
        r.l=l;
        int i,c=0;
        for(i=0;i<=l;++i){
            r.s[i]=s[i]-b.s[i]+c;
            if (r.s[i]<0) {c=-1;r.s[i]+=bsize;}
            else c=0;
        }
        while(r.l&&r.s[r.l]==0) --r.l;
        return r;
    }
    bign operator -(int b){bign r;r=b;return *this-r;}
    bign operator -=(bign b){return *this=*this-b;}
    bign operator -=(int b){return *this=*this-b;}


    bign operator *(bign b){
        bign r;
        int i,j;
        for(i=0;i<=l;++i){
            for(j=0;j<=b.l;++j){
                r.s[i+j]+=s[i]*b.s[j];
                if (r.s[i+j]>=bsize)
                    {r.s[i+j+1]+=r.s[i+j]/bsize;r.s[i+j]%=bsize;}
            }
        }

        r.l=l+b.l+1;
        while(r.l&&r.s[r.l]==0) --r.l;
        return r;
    }
    bign operator *(long long b){//caution for long long overflow
        bign r;
        int i;
        long long t=0;
        for(i=0;i<=l;++i){
            t+=s[i]*b;
            r.s[i]=t%bsize;
            t=t/bsize;
        }
        r.l=l;
        while(t){r.s[++r.l]=t%bsize;t=t/bsize;}
        while(r.l&&r.s[r.l]==0) --r.l;
        return r;
    }
    bign operator *=(bign b){return *this=*this*b;}
    bign operator *=(long long b){return *this=*this*b;}

    void shlnadd(int val){
        for(int i=l;i>=0;--i){s[i+1]=s[i];}
        s[0]=val;
        ++l;
        while(l&&s[l]==0) --l;
    }

    bign operator /(bign b){
        bign r,t;
        int i,j;
        bign tb[bbit];
        for(i=0;i<bbit;++i) tb[i]=b*bsav[i];
        for(i=l;i>=0;--i){
            t.shlnadd(s[i]);
            for(j=bbit-1;j>=0;--j){
                while(tb[j]<=t){
                    t-=tb[j];
                    r.s[i]+=bsav[j];
                }
            }
        }
        if (l>b.l) r.l=l-b.l;
        else r.l=0;
        while(r.l&&r.s[r.l]==0) --r.l;
        return r;
    }
    bign operator /(int b){ //caution for int overflow:1000*b
        int i,j;
        bign r;
        int tb[bbit];
        int t=0;
        for(i=0;i<bbit;++i) tb[i]=b*bsav[i];
        for(i=l;i>=0;--i){
            t=t*bsize+s[i];
            for(j=bbit-1;j>=0;--j){
                while(tb[j]<=t){
                    t-=tb[j];
                    r.s[i]+=bsav[j];
                }
            }
        }
        r.l=l;
        while(r.l&&r.s[r.l]==0) --r.l;
        return r;
    }

    //bign operator /(int b){bign r;r=b;return *this/r;}
    bign operator /=(bign b){return *this=*this/b;}
    bign operator /=(int b){return *this=*this/b;}

    void print(int func){
        printf("%d",s[l]);
        for(int i=l-1;i>=0;--i) printf("%04d",s[i]);
        if (func) puts("");
    }
};
//高精小数,bbit只能为1
struct bigf{
    bign num;
    int pos;
    bigf(){num.init();pos=0;}
    bigf operator =(char *s){
        int l=strlen(s);
        int tmp=0;
        for(int i=0;i<l;++i){
            if (s[i]=='.') pos=l-1-i;
            else tmp=tmp*10+s[i]-'0';
        }
        num=tmp;
    }
    bigf operator *(bigf b){
        bigf ret;
        ret.num=num*b.num;
        ret.pos=pos+b.pos;
        return ret;
    }
    void print(){
        int i,b=pos;
        for(i=0;i<pos;++i) if (num.s[i]!=0) {b=i;break;}
        for(i=num.l;i>=pos;--i) printf("%d",num.s[i]);
        printf(".");
        for(i=pos-1;i>=b;--i) printf("%d",num.s[i]);
    }
};


内容概要:本文针对国内加密货币市场预测研究较少的现状,采用BP神经网络构建了CCi30指数预测模型。研究选取2018年3月1日至2019年3月26日共391天的数据作为样本,通过“试凑法”确定最优隐结点数目,建立三层BP神经网络模型对CCi30指数收盘价进行预测。论文详细介绍了数据预处理、模型构建、训练及评估过程,包括数据归一化、特征工程、模型架构设计(如输入层、隐藏层、输出层)、模型编译与训练、模型评估(如RMSE、MAE计算)以及结果可视化。研究表明,该模型在短期内能较准确地预测指数变化趋势。此外,文章还讨论了隐层节点数的优化方法及其对预测性能的影响,并提出了若干改进建议,如引入更多技术指标、优化模型架构、尝试其他时序模型等。 适合人群:对加密货币市场预测感兴趣的研究人员、投资者及具备一定编程基础的数据分析师。 使用场景及目标:①为加密货币市场投资者提供一种新的预测工具和方法;②帮助研究人员理解BP神经网络在时间序列预测中的应用;③为后续研究提供改进方向,如数据增强、模型优化、特征工程等。 其他说明:尽管该模型在短期内表现出良好的预测性能,但仍存在一定局限性,如样本量较小、未考虑外部因素影响等。因此,在实际应用中需谨慎对待模型预测结果,并结合其他分析工具共同决策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值