引言
总所周知 c++中整型的最大数位为一般就是long long int 类型(10^18)
可当题目要求数位过高时,我们应该如何操作呢?
大数相加的思路:
大致是运用string类,模拟算术运算,可以用栈来做颠倒数位的工作
下面上例题:
小明在做小红给他出的算术题加法题,但是小红为了治一治小明懒惰的毛病,给他出的数都很大,这下小明郁闷了,想请你帮忙。
输入 输入的第一行是一个正整数N,表示一共有N组测试数据。 每组数据由1~100行正整数组成,每行正整数的长度不大于100位。
当输入0时,表示此组数据输入完毕。 输出 对于每组输入数据,输出所有数字的总和。每两组输出数据之间有一个空行。
样例输入
2
123456789012345678901234567890
123456789012345678901234567890
123456789012345678901234567890
0
12
34
0
样例输出
370370367037037036703703703670
46
上代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<stack>
using namespace std;
stack<char>st;
string bigsum(string a,string b)//大数相加函数
{ string ans="";
if(a=="0")
return b;
int la=a.length() -1;
int lb=b.length()-1;//由于at的查询自0起
int c=0;
while(la>=0&&lb>=0)//由于0的ASCII码是48;
{ c+=a.at(la)-'0'+b.at(lb)-'0';//减去0即转为int的aslii码
st.push((char)(c%10+'0'));//加上0即转为char类型
c/=10;
la--;
lb--;
}
while(la>=0)
{
c+=a.at(la)-'0';
st.push((char)(c%10+'0'));
c/=10;
la--;
}
while(lb>=0)
{
c+=a.at(lb)-'0';
st.push((char)(c%10+'0'));
c/=10;
lb--;
}
while(c!=0)
{
st.push((char)(c%10+'0'));
c/=10;
}
while(!st.empty())
{
ans+=st.top();
st.pop() ;
}
return ans;
}
int main()
{
int t;
string n;
cin>>t;
while(t--)
{ string s="0";
while(cin>>n)
{
if(n=="0")
{
if(s!="0")
cout<<s<<endl;
break;
}
s=bigsum(s,n);
}
if(t>0)
{
printf("\n");
}
}
return 0;
}
其中易错点就是int类型与char类型在转换过程中加减0的处理;
写了一个更简化的版本
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
string x,y;
int a[10000],b[10000],c[10000],la,lb,lc;
int main()
{
cin>>x>>y;
la=x.length() ;
lb=y.length() ;
for(int i=0;i<la;i++)
a[la-i]=x[i]-'0';
for(int i=0;i<lb;i++)
b[lb-i]=y[i]-'0';
lc=max(la,lb);
for(int i=1;i<=lc;i++)
{c[i]+=a[i]+b[i];
c[i+1]=c[i]/10;
c[i]%=10;}
if(c[lc+1]>0) lc++;
for(int i=lc;i>0;i--)
cout<<c[i];
return 0;
}