也是属于大数求和的问题,只是是输入多行数据,多行想加,与1003的区别是这里的进位carry可能超过10,carry注意处理,还有就是只输入一行和一行都不输入直接输入0的特殊情况。比较坑的是格式问题,看半天没看懂输入输出格式。输入第一行是一个整数,表示有几个输入块,每个输入块结束的标志为0,每块之间要有一个空行,最后一块,输出后也要换行。
Sample Input
1
123456789012345678901234567890
123456789012345678901234567890
123456789012345678901234567890
0
123456789012345678901234567890
123456789012345678901234567890
123456789012345678901234567890
0
Sample Output
370370367037037036703703703670
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
vector<string> v;
string s;
int t;
cin>>t;
while(t--)
{
v.clear();
while(cin>>s&&s!="0")
{
v.push_back(s);
}
s.clear();
if(v.size()!=0&&v.size()!=1){
int max =0,c=0;
for(int i=0;i<v.size();i++)
if(v[i].size()>=max)
max = v[i].size();
for(int i=0;i<v.size();i++)
{
reverse(v[i].begin(),v[i].end()); //对所有字符串反转,且后面加零
v[i].resize(max,'0');
}
int carry = 0;
for(int i=0;i<max;i++)
{
c=0;
for(int n =0 ;n<v.size();n++)
{
c+=v[n][i]-48; //一列求和;
}
s.push_back((c+carry)%10+48);
carry = (c+carry)/10;
}
while(carry>0)
{
c = carry%10;
carry/=10;
s.push_back(c+48);
}
reverse(s.begin(),s.end());
}
else if(v.size()==0)s="0";
else if(v.size()==1)s=v[0];
if(t!=0)
cout<<s<<endl<<endl;
else
cout<<s<<endl;
}
}