摘要

题目链接 难度等级 完成状态 完成分数 最后编辑时间 失误原因(初次提交分数)
A + B Problem II ★☆☆☆☆ 答案正确 100 2015-02-06 10:40:45 输出格式(0)

题意

高精度A+B。

题解

  • 这次Presentation Error的原因居然是文末换行……因为一般只自动过滤一个……这种设定sigh
  • 嗯,直接用了高精度模板

代码

1002.cpp代码已折叠
展开折叠内容
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<vector>
using namespace std;
class largeInt
{
   public:
       const int size() const
        {
            return u.size();
        }
        largeInt()
        {
            u.clear();
            u.push_back(0);
        }
        largeInt(const int &number)
        {
            u.clear();
            u.push_back(number);
            carry();
        }
        friend istream& operator >> (istream& os,largeInt &ob)
        {
            ob.u.clear();
            string original;
            os>>original;
            for(int i=original.size()-1,j=0,p=1;i>=0;--i)
            {
                j+=(original[i]-'0')*p;
                p*=10;
                if((!i) || p==10000)
                {
                    ob.u.push_back(j);
                    j=0;
                    p=1;
                }
            }
            return os;
        }
        friend ostream& operator << (ostream& os,const largeInt &ob)
        {
            os<<setw(0)<<setfill('0')<<ob.u[ob.size()-1];
            for(int i=ob.size()-2;i>=0;--i)
                os<<setw(4)<<setfill('0')<<ob.u[i];
            return os;
        }
        friend const largeInt operator +(const largeInt &a,const largeInt &b)
        {
            largeInt r;
            r.u.resize(max(a.size(),b.size()));
            for(int i=0;i<r.size();++i)
            {
                if(i<a.size())
                    r.u[i]+=a.u[i];
                if(i<b.size())
                    r.u[i]+=b.u[i];
            }
            r.carry();
            return r;
        }
        friend const largeInt operator *(const largeInt &a,const largeInt &b)
        {
            largeInt r;
            r.u.resize(a.size()+b.size());
            for(int i=0;i<a.size();++i)
            {
                for(int j=0;j<b.size();++j)
                {
                    r.u[i+j]+=a.u[i]*b.u[j];
                }
            }
            r.carry();
            return r;
        }
    private:
        vector<int> u;
        void carry()
        {
            for(int i=0;i<size();++i)
            {
                if(u[i]>=10000)
                {
                    if(i==size()-1)
                        u.push_back(u[i]/10000);
                    else
                        u[i+1]+=u[i]/10000;
                    u[i]%=10000;
                }
            }
            for(int i=size()-1;i!=0;--i)
            {
                if(u[i]==0)
                {
                    u.pop_back();
                }else{
                    break;
                }
            }
        }
};

int main()
{
    int t;
    largeInt a,b;
    cin>>t;
    for(int c=1;c<=t;++c)
    {
        cin>>a>>b;
        cout<<"Case "<<c<<":"<<endl;
        cout<<a<<" + "<<b<<" = "<<a+b<<endl;
        if(c!=t)//fixed:文末换行//
            cout<<endl;
    }
    return 0;
}

著作权声明[编辑]

关于[编辑]