高精度板子

高精度

然而我当然是不会去手搓板子的,所以我就粘了SoyTony学长dalao的高精度板子过来

高精度

#define ll long long
#define base 10000
struct largenum{//Tony_dalao的高精度板子 
    int num[10005];
    inline void scan(){
        char s[10005];
        scanf("%s",s+1);
        int len=strlen(s+1);
        for(int i=len;i>=1;i-=4){
            int j=max(i-3,1);
            int sum=0;
            while(j<=i){
                sum=sum*10+(s[j++]-'0');
            }
            num[++num[0]]=sum;
        }
    }
    inline void print(){
        printf("%d",num[num[0]]);
        for(int i=num[0]-1;i>=1;i--){
            printf("%04d",num[i]);
        }
        printf(" ");
    }
    largenum operator *(const largenum &tmp)const{
        largenum res;
        memset(res.num,0,sizeof(res.num));
        res.num[0]=num[0]+tmp.num[0];
        for(int i=1;i<=num[0];i++){
            for(int j=1;j<=tmp.num[0];j++){
                res.num[i+j-1]+=num[i]*tmp.num[j];
                res.num[i+j]+=res.num[i+j-1]/base;
                res.num[i+j-1]%=base;
            }
        }
        while(res.num[res.num[0]]) res.num[0]++;
        while(!res.num[res.num[0]]&&res.num[0]>1) res.num[0]--;
        return res;
    }
    largenum operator *(const int &tmp)const{
        largenum res;
        memset(res.num,0,sizeof(res.num));
        res.num[0]=num[0];
        int laz=0;
        for(int i=1;i<=res.num[0];i++){
            res.num[i]=num[i]*tmp+laz;
            laz=res.num[i]/base;
            res.num[i]=res.num[i]%base;
        }
        while(laz){
            res.num[++res.num[0]]=laz%base;
            laz/=base;
        }
        while(res.num[res.num[0]]) res.num[0]++;
        while(!res.num[res.num[0]]&&res.num[0]>1) res.num[0]--;
        return res;
    }
    int operator %(const int &tmp)const{
        int res=0;
        for(int i=num[0];i>=1;i--){
            res=(res*base+num[i])%tmp;
        }
        return res;
    }
    largenum operator /(const int &tmp)const{
        largenum res;
        memset(res.num,0,sizeof(res.num));
        res.num[0]=num[0];
        ll laz=0;
        for(int i=res.num[0];i>=1;i--){
            res.num[i]=(laz*base+num[i])/tmp;
            laz=(laz*base+num[i])%tmp;
        }
        while(!res.num[res.num[0]]&&res.num[0]>1) res.num[0]--;
        return res;
    }
};
inline largenum ksm(largenum x,int p){
    largenum res;
    memset(res.num,0,sizeof(res.num));
    res.num[0]=res.num[1]=1;
    while(p){
        if(p&1){
            res=res*x;
        }
        x=x*x;
        p>>=1;
    }
    return res;
}
posted @   char_phi  阅读(34)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示