提交记录 8357


用户 题目 状态 得分 用时 内存 语言 代码长度
a_big_JuRuo 1004. 【模板题】高精度乘法 Time Limit Exceeded 0 3 s 14648 KB C++11 5.77 KB
提交时间 评测时间
2019-02-13 11:10:43 2020-08-01 01:17:23
#include <bits/stdc++.h>
using namespace std;
struct bigint
{
    static const int N=1000001;
    static const int BASE=100000;
    static const int WIDTH=5;
    typedef int used_type;
    used_type a[N]; 
    int len;
    bool sgn;
    void setlen()
    {
        if(a[len+1])len++;
        while(len>1 && a[len]==0) --len;
    }
    bigint()
    {
        memset(a,0,sizeof(a[0])*N);
        len=1;sgn=1;
    }
    ~bigint()
    {
        //没有屁用233
    }
    bigint(const int n)
    {
        *this=n;
    }
    bigint(const char*n)
    {
        *this=n;
    }
    bigint(used_type *a_,int len_,int sgn_)
    {
        memcpy(a,(const void*)a_,N*sizeof(a[0]));
        len=len_;
        sgn=sgn_;
    }
    bigint& operator=(const bigint &b)
    {
        if(this!=&b)
        {
            memcpy(a,(const void*)b.a,N*sizeof(a[0]));
            len=b.len;
            sgn=b.sgn;
        }
        return *this;
    }
    bigint& operator=(const char*aa)
    {
        memset(a,0,sizeof(a[0])*N);
        if(aa[0]=='-') sgn=0,++aa;
        else sgn=1;
        len=0;
        int lenaa=strlen(aa);
        for(int j=lenaa-1;j>=0;j-=WIDTH)
        {
            int i=j-WIDTH+1;
            if(i<0) i=0;
            int buf=0;
            for(int k=i;k<=j;k++)
            {
                buf*=10;
                buf+=aa[k]-'0';
            }
            a[++len]=buf;
        }
        return *this;
    }
    bigint& operator=(const int &b)
    {
        char buf[25];
        sprintf(buf,"%d",b);
        return *this=buf;
    }
    bigint& operator + ()
    {
        return *this;
    }
    bigint operator - ()
    {
        return bigint(this->a,this->len,!this->sgn);
    }
    friend bool operator < (const bigint &a,const bigint &b)
    {
        if(a.len!=b.len) return a.len<b.len;
        else
        for(int i=a.len;i>0;i--)
        {
            if(a.a[i]!=b.a[i]) return a.a[i]<b.a[i];
        }
        return 0;
    }
    friend bool operator == (const bigint &a,const bigint &b)
    {
        return  a.len==b.len && a.sgn==b.sgn && memcmp(a.a,b.a,N*sizeof(used_type))==0;
    }
    friend bool operator > (const bigint &a,const bigint &b){return b<a;}
    friend bool operator >= (const bigint &a,const bigint &b){return !(a<b);}
    friend bool operator <= (const bigint &a,const bigint &b){return !(a>b);}
    friend bool operator != (const bigint &a,const bigint &b){return !(a==b);}
    friend bigint operator+(const bigint &a,const bigint &b)
    {
        if(a.sgn==0)
        {
            if(b.sgn==0) return -((-(bigint)a)+(-(bigint)b));
            else return b-(-(bigint)a);
        }
        else if(b.sgn==0) return a-(-(bigint)b);
        bigint c;
        c.len=max(a.len,b.len);
        for(int i=1;i<=c.len;i++)
        {
            c.a[i]+=a.a[i]+b.a[i];
            c.a[i+1]+=c.a[i]/BASE;
            c.a[i]%=BASE;
        }
        if(c.a[c.len+1]) c.len++;
        return c;
    }
    bigint& operator +=(const bigint &a)
    {
        return *this=*this+a;
    }
    bigint& operator ++()
    {
        return *this=*this+1;
    }
    bigint operator ++(int)
    {
        bigint c=*this;
        *this=*this+1;
        return c;
    }
    friend bigint operator-(const bigint &a,const bigint &b)
    {
        if(a.sgn==0)
        {
            if(b.sgn==0) return (-(bigint)b)-(-(bigint)a);
            else return -((-(bigint)a)+b);
        }
        else if(b.sgn==0) return (a+(-(bigint)b));
        if(a<b) return -(b-a);
        bigint c;
        for(int i=1;i<=c.len;i++)
        {
            c.a[i]+=a.a[i]-b.a[i];
            if(c.a[i]<0)
            {
                c.a[i]+=BASE;
                c.a[i+1]--;
            }
        }
        c.setlen();
        return c;
    }
    bigint& operator -=(const bigint &a)
    {
        return *this=*this-a;
    }
    bigint& operator --()
    {
        return *this=*this-1;
    }
    bigint operator --(int)
    {
        bigint c=*this;
        *this=*this-1;
        return c;
    }
    friend bigint operator * (const bigint &a,const bigint &b)
    {
        bigint c;
        c.sgn=(a.sgn==b.sgn);
        c.len=(a.len+b.len);
        for(int i=1;i<=a.len;i++)
        {
            for(int j=1;j<=b.len;j++)
            {
            	long long x=c.a[i+j-1];
            	x+=(long long)a.a[i]*b.a[j];
            	c.a[i+j-1]=x%BASE;
                c.a[i+j]+=int(x/BASE);
	        }
        }
        if(c.a[c.len+1]>0) c.len++;
        while(c.len>1 && c.a[c.len]==0) c.len--;    
        return c;
    }
    bigint& operator *=(const bigint &a)
    {
        return *this=*this*a;
    }
    void input()
    {
        char *s=new char[N+10];
        scanf("%[+-0123456789]",s);
        *this=s;
        delete[] s;
    }
    void output()
    {
        if(!sgn) printf("-");
        char sbuf[6]="";
        sprintf(sbuf,"%c%d%d%c",'%',0,WIDTH,'d');
        for(int i=len;i;i--)
        {
            if(i!=len) printf(sbuf,a[i]);
            else printf("%d",a[i]);
        }    
    }
    friend istream& operator >> (istream &in,bigint &b)
    {
        if(!in) return in;
        string str;
        in>>str;
        b=str.c_str();
        return in;
    }
    friend ostream& operator << (ostream &out,const bigint &b)
    {
        if(!b.sgn) out<<"-";
        for(int i=b.len;i;i--)
        {
            if(i!=b.len)
                out<<setw(WIDTH)<<setfill('0')<<(int)b.a[i];
            else out<<b.a[i];
        }
        return out;
    }
};
bigint chuyi2(bigint a)
{
    for(int i=a.len;i>0;--i)
    {
        if(a.a[i]<2)
        {
            a.a[i-1]+=a.a[i]%2*10;
            a.a[i]=0;
        }
        else
        if(i==1)
        {
            a.a[1]/=2;
        }
        else
        {
            a.a[i-1]+=a.a[i]%2*10;
            a.a[i]/=2;
        }
    }
    a.setlen();
    return a;
}
int main()
{
    bigint a,b;
    cin>>a>>b;
    cout<<a*b<<endl;
    return 0;
}

CompilationN/AN/ACompile OKScore: N/A

Testcase #13 s14 MB + 312 KBTime Limit ExceededScore: 0


Judge Duck Online | 评测鸭在线
Server Time: 2026-04-06 22:05:36 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠