【高精度運算】

來源:互聯網
上載者:User

雖說高精度直接考查的越來越少,不過還是以防萬一。

#define maxlen 1000struct 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;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.