给定一些大整数,请计算其和。
输入格式:
测试数据有多组。对于每组测试数,首先输入一个整数n(n≤100),接着输入n个大整数(位数不超过200)。若n=0则表示输入结束。
输出格式:
对于每组测试,输出n个整数之和,每个结果单独占一行。
输入样例:
2
43242342342342
-1234567654321
0
输出样例:
42007774688021
//完全取自于我们同学写的博客,为了让更多人看见,如果有更简单或者更详细的欢迎评论,高精度算法是个难点,对于此题,涉及多组输入,同时每组输入不只是两个数求和,而且还有负数存在,对于高精度的题,可以尝试用python去做,直接加起来就行,但在c++中,因为时间限制或内存限制,一般以字符串进行处理,用一个数保留进位,另一个数组存储
#include<bits/stdc++.h>
using namespace std;
vector<int> add(vector<int>&A,vector<int>&B)//加法
{
vector<int>C;
for(int i=0,t=0;i<A.size()||i<B.size()||t;i++)
{
if(i<A.size()) t+=A[i];
if(i<B.size()) t+=B[i];
C.push_back(t%10);
t/=10;
}
while(C.back()==0&&C.size()>1) C.pop_back();//去掉前导的零
return C;
}
vector<int> sub(vector<int>&A,vector<int>&B)//减法
{
vector<int>C;
for(int i=0,t=0;i<A.size();i++)
{
t=A[i]-t;
if(i<B.size()) t-=B[i];
C.push_back((t+10)%10);
if(t<0) t=1;
else t=0;
}
while(C.back()==0&&C.size()>1) C.pop_back();
return C;
}
bool cmp(vector<int>&A,vector<int>&B)//比较大小,前面大返回真,否则返回假
{
if(A.size()!=B.size()) return A.size()>B.size();
for(int i=0;i<A.size();i++)
if(A[i]!=B[i]) return A[i]>B[i];
return true;
}
int main()
{
int n;
while(cin>>n&&n!=0)
{
int a1=1,ans1=1;//判断符号
vector<int>ans={0};//初始化
while(n--)
{
string a;
vector<int>A;
cin>>a;
if(a[0]=='-')
{
a1=0;
for(int i=a.size()-1;i>0;i--) A.push_back(a[i]-'0');
}
else
{
for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
a1=1;
}
if(cmp(ans,A))//前面大
{
if(ans1&&a1) ans=add(ans,A),ans1=1;
else if(ans1&&!a1) ans=sub(ans,A),ans1=1;
else if(!ans1&&!a1) ans=add(ans,A),ans1=0;
else ans=sub(ans,A),ans1=0;
}
else
{
if(ans1&&a1) ans=add(ans,A),ans1=1;
else if(ans1&&!a1) ans=sub(A,ans),ans1=0;
else if(!ans1&&!a1) ans=add(ans,A),ans1=0;
else ans=sub(A,ans),ans1=1;
}
}
if(!ans1&&ans[0]) cout<<"-";//处理符号和处理负零的情况
for(int i=ans.size()-1;i>=0;i--) cout<<ans[i];
cout<<endl;
}
return 0;
}