UVA 10106 Product (高精度乘法)

来源:互联网 发布:linux中的pwd命令 编辑:程序博客网 时间:2024/05/29 09:38

给你A,B,求A乘B。

A和B都有250位,那么结果最多500位,注意长度。

#include <bits/stdc++.h>using namespace std;const int MAXN=9999;#define DLEN 4const int NNN=1e4+10;class BigNum{private:    int a[NNN];    int len;public:    BigNum(){len=1;memset(a,0,sizeof(a));}    BigNum(const int);    BigNum(const char*);    BigNum operator^(const int &)const;    BigNum operator*(const BigNum &)const;    void print();};BigNum::BigNum(const char * s){    int t,k,index,L,i;    memset(a,0,sizeof(a));    L=strlen(s);    len=L/DLEN;    if(L%DLEN)len++;    index=0;    for(i=L-1;i>=0;i-=DLEN)    {        t=0;        k=i-DLEN+1;        if(k<0)k=0;        for(int j=k;j<=i;j++)            t=t*10+s[j]-'0';        a[index++]=t;    }}BigNum::BigNum(const int b){    int c,d=b;    len=0;    memset(a,0,sizeof(a));    while(d>MAXN)    {        c=d-(d/(MAXN+1))*(MAXN+1);        d=d/(MAXN+1);        a[len++]=c;    }    a[len++]=d;}BigNum BigNum::operator*(const BigNum &T)const{    BigNum ret;    int i,j,up;    int temp,temp1;    for(i=0;i<len;i++)    {        up=0;        for(j=0;j<T.len;j++)        {            temp=a[i]*T.a[j]+ret.a[i+j]+up;            if(temp>MAXN)            {                temp1=temp-temp/(MAXN+1)*(MAXN+1);                up=temp/(MAXN+1);                ret.a[i+j]=temp1;            }            else            {                up=0;                ret.a[i+j]=temp;            }        }            if(up!=0)                ret.a[i+j]=up;        }        ret.len=i+j;        while(ret.a[ret.len-1]==0 && ret.len>1)ret.len--;        return ret;    }BigNum BigNum::operator^(const int &n)const{    BigNum t,ret(1);    int i;    if(n<0)exit(-1);    if(n==0)return 1;    if(n==1)return *this;    int m=n;    while(m>1)    {        t=*this;        for(i=1;(i<<1)<=m;i<<=1)            t=t*t;        m-=i;        ret=ret*t;        if(m==1)ret=ret*(*this);    }    return ret;}void BigNum::print(){    int i;    printf("%d",a[len-1]);    for(i=len-2;i>=0;i--)        printf("%04d",a[i]);    printf("\n");}char c1[NNN],c2[NNN];int main(){    while(cin>>c1>>c2)    {BigNum a(c1);    BigNum b(c2);    BigNum ans=a*b;    ans.print();    }    return 0;}


原创粉丝点击