[note]高精度模板

高精度模板

先定义一个struct

struct gj{
    int l,s[N];
    bool fh;
    void Print(){
        if(fh)putchar('-');
        for(int i=l;i>=1;i--)printf("%d",s[i]);
        puts("");
    }
}blank;

高精+高精

加之前判断一下符号
一负一正转成减法

gj operator +(gj x,gj y){
    gj z=blank;z.l=max(x.l,y.l);
    for(int i=1;i<=z.l;i++){
        z.s[i]+=x.s[i]+y.s[i];
        if(z.s[i]>9)z.s[i+1]++,z.s[i]-=10;
    }
    if(z.s[z.l+1])z.l++;
    return z;
}

高精-高精

gj operator -(gj x,gj y){
    gj z=blank;z.l=max(x.l,y.l);
    for(int i=z.l;i>=1;i--){
        if(x.s[i]==y.s[i])continue;
        if(x.s[i]<y.s[i])swap(x,y),z.fh=1;
        break;
    }
    for(int i=1;i<=z.l;i++){
        z.s[i]+=x.s[i]-y.s[i];
        if(z.s[i]<0)z.s[i]+=10,z.s[i+1]--;
    }
    while(!z.s[z.l]&&z.l>1)z.l--;
    return z;
}

高精*高精

gj operator *(gj x,gj y){
    gj z=blank;z.l=x.l+y.l;
    for(int i=1;i<=x.l;i++){
        int jw=0;
        for(int j=1;j<=y.l;j++){
            z.s[i+j-1]+=x.s[i]*y.s[j]+jw;
            jw=z.s[i+j-1]/10;
            z.s[i+j-1]%=10;
        }
        z.s[i+b.l]=jw;
    }
    while(z.l>1&&!z.s[z.l])z.l--;
    return z;
}

原文地址:https://www.cnblogs.com/sdzwyq/p/9930047.html

时间: 2024-08-10 19:36:57

[note]高精度模板的相关文章

[Template]高精度模板

重新写一下高精度模板(不要问我为什么) 自认为代码风格比较漂亮(雾 如果有更好的写法欢迎赐教 封装结构体big B是压位用的进制,W是每位长度 size表示长度,d[]就是保存的数字,倒着保存,从1开始 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const i

高精度模板(Big_Int)

你还在为刷题时看到的高精度预警而苦恼吗? 你还在因为高精度难写而放弃宝贵的分数吗? 不用担心!让高精度模板 来帮助你! 目前已知bug: 长度最大值只能开到54724,超过这个值会爆炸(无法调试),目前原因未知 2018.09.07更新: 1.优化了高精乘以低精的速度. 2.输出优化,可使用.output()函数输出.(基于输出挂)@Jesse666 ps:那个长度最大值的bug有可能是栈空间的问题,可以试试更改栈空间有没有效果 2018.09.01更新: 1.鉴于@Jesse666同学的建议,

高精度模板(不定时更新)

以前写高精度基本都是抄别人的--这次要改变一下了-- 现在的高精度模板还是很简陋的,只支持高精加,减,乘,高精除低精,高精模低精,高精快速幂,高精比较大小,没了. 或许以后会不定期更新一下--毕竟这个还是比较ca的. 直接一股脑全贴上来吧--注意所有的元素都是倒叙存储的,想要改成压位的很简单,只要改一下模数,改一下输入输出即可. 也可以支持不同进制的运算,都是很好改的. struct big { int f[M],len; big() { memset(f,0,sizeof(f)),len =

高精度模板(修改中)

这个是一个高精度的模板,还在完成中... 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstdlib> 5 #include<cmath> 6 #include<cstring> 7 #include<vector> 8 #define xh(a,b,c)for(int a=(b);a<=(c);a++) 9 #de

真&#183;纯手撸高精度模板

耗时(50分钟)不压位 内容只有高精度+-*,因为其他我不会写QAQ~ 均ACluogu,codevs #include<bits/stdc++.h> using namespace std; const int N =(int)1e5+10; struct bignum { int m[N],len; char str[N]; int ok; bignum() {ok=1;len=1,memset(m,0, sizeof(m));} void in() {scanf("%s&quo

高精度模板2(带符号压位加减乘除开方封包)

原来的那个模板:http://www.cnblogs.com/iwtwiioi/p/3991331.html 估计已经不用了. 现在我重新封包好了一个,一定很好用QAQ 加减乘除带开方带压位带重载运算符 注意一下符号即可,一定写的时候要手推四种情况!! 然后在重载<的时候,一定要注意同时判断!!!!要不然又错.. struct big { typedef ll INT; static const INT S=100000000; static const int S_n=9; static co

大整数类BIGN的设计与实现 C++高精度模板

首先感谢刘汝佳所著的<算法竞赛入门经典>. 众所周知,C++中储存能力最大的unsigned long long 也是有着一个上限,如果我们想计算非常大的整数时,就不知所措了,所以,我写了一个高精度类,允许大整数的四则运算 这个类利用字符串进行输入输出,并利用数组进行储存与处理,通过模拟四则运算,可以计算很大的整数的加减乘除比大小. 贴上我的代码: #include<string> #include<iostream> #include<iosfwd> #i

高精度模板总结

高精度取余 1.高精度取单精度 int hmod(string a,int b)//高精度取余单精度 输出余数 { int temp=0; unsigned long len=a.length(); for(int i=0;i<len;i++) temp=(temp*10+a[i]-'0')%b; return temp; }

【高精度】【模板】高精度模板

没有什么好说的,照着模板写就是了,稍微用了点手段,支持负数的减法了 1 #include<cstdio> 2 #include<cstring> 3 #include<string> 4 #include<algorithm> 5 #include<vector> 6 #include<iostream> 7 using namespace std; 8 const int maxn=510; 9 struct bigint 10 {