【高精度运算】

虽说高精度直接考查的越来越少,不过还是以防万一。

#define maxlen 1000
struct bint{
    int len,s[maxlen];
    bint(){len=1;memset(s,0,sizeof(s));}
    //*******本模板既可输入字符串,也可输入整数*******//
    bint(int t){
    memset(s,0,sizeof(s));len=1;
    while(t){s[len++]=t%10;t/=10;}
    if(len>1)len--;
    }
    bint(char *str){
    memset(s,0,sizeof(s));len=strlen(str);
    for(int i=1;i<=len;i++)s[i]=str[len-i]-'0';
    }
    //print number
    friend void print(bint bi){
    for(int i=bi.len;i>=1;i--)printf("%d",bi.s[i]);
    }
    //print number+enter
    friend void println(bint bi){
    print(bi);printf("\n");
    }
    //可作连=运算
    bint operator=(int t){
    len=1;if(t==0){s[1] = 0;return *this;}
    while(t){s[len++]=t%10;t/=10;}
    len--;
    return *this;
    }
    bint operator=(char *str){
    len=strlen(str);
    for(int i=1;i<=len;i++)s[i]=str[len-i]-'0';
    return *this;
    }
    friend int cmp(const bint &a,const bint &b){
    //a>b返回正数,a==b返回0,a<b返回负数
    if(a.len!=b.len)return a.len-b.len;
    for(int i=a.len;i>0;i--)
    if(a.s[i]!=b.s[i])return a.s[i]-b.s[i];
    return 0;
    }
    //*******加法*******//
    bint operator+(const bint &bi){
    int i; bint c;
    for(i=1;i<=len || i<=bi.len || c.s[i];i++){
    c.s[i]+=s[i]+bi.s[i];
    c.s[i+1]=c.s[i]/10;c.s[i]%=10;
    }
    if(i>1)c.len=i-1;
    return c;
    }
    //*******减法*******//
    bint operator-(const bint &bi){//只考虑a>=b,不考虑负数
    int i,j; bint c;
    for(i=1,j=0;i<=len;i++){
    c.s[i]=s[i]-j;if(i<=bi.len)c.s[i]-=bi.s[i];
    if(c.s[i]<0){j=1;c.s[i]+=10;}else j=0;
    }
    c.len=len;while(c.len>1 && !c.s[c.len])c.len--;
    return c;
    }
    //*******乘法*******//
    bint operator*(const bint &bi){
    int i,j;bint c;c.len=len+bi.len;
    for(i=1;i<=len;i++)
    for(j=1;j<=bi.len;j++)c.s[i+j-1]+=s[i]*bi.s[j];
    for(i=1;i<c.len || c.s[i];i++){
    c.s[i+1]+=c.s[i]/10;c.s[i]%=10;
    }
    while(i>1 && !c.s[i])i--;c.len=i;
    return c;
    }
    //*******除法*******//
    bint operator/(const bint &bi){
    int i,j;bint d,c;
    for(i=len;i>0;i--){
    if(!(d.len==1 && d.s[1]==0)){
    for(j=d.len;j>0;j--)d.s[j+1]=d.s[j];
    ++d.len;
            }
    d.s[1]=s[i];
    while((j=cmp(d,bi))>=0){
    d=d-bi;c.s[i]++;
    if(j==0)break;
            }
        }
    c.len=len;
    while(c.len>1 && c.s[c.len]==0)c.len--;
    return c;
    }
    //*******取余*******//
    bint operator%(const bint &bi){
    int i,j;bint d;
    for(i=len;i>0;i--){
    if(!(d.len==1 && d.s[1]==0)){
    for(j=d.len;j>0;j--)d.s[j+1]=d.s[j];
    ++d.len;
        }


    d.s[1]=s[i];
    while((j=cmp(d,bi))>=0){d=d-bi;if(j==0)break;}
        }
    return d;
    }
    //*******次方*******//
    bint pow(int exp){
    bint ret = 1, t = (*this);
    while (exp){
    if (exp & 1)
    ret = ret * t;
    exp >>= 1; t = t * t;
        }
    return ret;
    }
};
bint a,b;
int main()
{
    char s1[100],s2[100];
    scanf("%s%s",s1,s2);
    a=bint(s1),b=bint(s2);
    println(a+b);
    println(a-b);//a>=b
    println(a*b);
    println(a/b);
    println(a.pow(3));
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值