题解 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;
}

浙公网安备 33010602011771号