1. 程式人生 > 實用技巧 >題解 UVA10013 【Super long sums】

題解 UVA10013 【Super long sums】

實際發表時間:2020-05-06
https://www.luogu.com.cn/problem/UVA10013
看見題解沒有\(\texttt{壓位高精+過載運算子}\),趕緊水一發

做法

  • Step1:輸入資料組數\(t\)
  • Step2:每一次輸入長度\(s\),然後輸入\(s\)行的兩個字元,再用字串拼接
  • Step3:\(\text{高精加法}\)
  • Step4:沙比地按格式輸出

程式碼

其他事項都在程式碼裡了

#include<bits/stdc++.h>
using namespace std;

struct BigNum//大整數結構體
{
	static const int BASE=100000000;//10^壓位數
	static const int WIDTH=8;//我壓8位
	vector<int>s;//用它來儲存
	BigNum operator=(const string &str)//賦值
	{
		s.clear();
		int x,len=(str.size()-1)/WIDTH+1;//8位8位賦值
		for (int i=0;i<len;i++)
		{
			int end=str.size()-i*WIDTH;
			int start=max(0,end-WIDTH);
			sscanf(str.substr(start,end-start).c_str(),"%d",&x);
			s.push_back(x);
		}
		return *this;
	}
	BigNum operator+(const BigNum &b) const//加法
	{
		BigNum c;//存結果
		c.s.clear();
		for (unsigned i=0,g=0;;i++)//8位8位加
		{
			if (g==0&&i>=s.size()&&i>=b.s.size())break;
			int x=g;
			if (i<s.size())x+=s[i];
			if (i<b.s.size())x+=b.s[i];
			c.s.push_back(x%BASE);//壓位
			g=x/BASE;
		}
		return c;
	}
	BigNum operator-(BigNum b) const//減法,此題用不到
	{
		if (*this<b)return b-*this;//如果被減數小於減數
		BigNum c;//結果
		c.s.clear();
		for (unsigned i=0;i<b.s.size();i++)b.s[i]=-b.s[i];
		c=*this+b;//a-b=a+(-b)
		c.s.push_back(0);//怕結果只有一位補個0
		for (unsigned i=0;i<c.s.size()-1;i++)
			if(c.s[i]<0)
			{
				c.s[i]+=BASE;//壓位!
				c.s[i + 1]--;
			}
		while(!c.s[c.s.size()-1])c.s.pop_back();
		return c;
	}
	bool operator<(const BigNum &b) const//小於
	{
		if (s.size()!=b.s.size())return s.size()<b.s.size();
		for (int i=s.size()-1;i>=0;i--)if(s[i]!=b.s[i])return s[i]<b.s[i];
		return false;
	}
	bool operator>(const BigNum &b) const//大於
	{
		return b<*this;
	}
}A,B;
ostream &operator<<(ostream &out,const BigNum x)//輸出流,注意不要引用&,不然沒法cout<<A+B
{
	out<<x.s.back();
	for(int i=x.s.size()-2;i>=0;i--)
	{
		char buf[20];
		sprintf(buf,"%08d",x.s[i]);
		for(unsigned j=0;j<strlen(buf);j++)out << buf[j];
	}
	return out;
}
istream &operator>>(istream &in,BigNum &x)//輸入流,一定要引用,要賦值的
{
	string s;
	if(!(in>>s))return in;
	x=s;
	return in;
}

int t,s;
string a,b;
char x,y;

int main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);//加速cincout
    cin>>t;//Step1
    while(t--)
    {
        cin>>s;//Step2
        a=b="";//記得先清空
        while(s--)
        {
            cin>>x>>y;
            a+=x,b+=y;
        }
        A=a,B=b;
        cout<<A+B<<endl;//Step3
        if(t>0)cout<<endl;//Step4
    }
	return 0;
}