代码模板:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N 10010
ll cnt1,cnt2;//记录两个数的位数
string a,b;//字符串输入俩大数
ll m[N],n[N];//按位依次将string a,b中的数保存到ll数组a,b中
int main()
{
cin>>a>>b;
//注意需要反向存
for(ll i=a.size()-1;i>=0;i--) m[cnt1++]=a[i]-'0';
for(ll i=b.size()-1;i>=0;i--) n[cnt2++]=b[i]-'0';
ll len=max(cnt1,cnt2);
ll c[N];//保持a+b的各位
for(ll i=0;i<len;i++)
{
c[i]=m[i]+n[i];
}
for(ll i=0;i<len;i++)//由于a,b相加后各个位上的数字可能会大于10,下面即处理进位问题
{
if(c[i]>=10)
{
c[i+1]+=c[i]/10;
c[i]%=10;
}
}
//下面ll数组c反向输出
//c[len]需要判0
if(c[len]==0)
{
for(ll i=len-1;i>=0;i--)
cout<<c[i];
}
else
{
for(ll i=len;i>=0;i--)
cout<<c[i];
}
}
例题: 牛客
例题AC代码:
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
typedef long long ll;
int main()
{
ll n;
cin>>n;
while(n--)
{
string v;
cin>>v;
ll pos=-1;
ll flag=1;
for(ll i=0;i<v.size();i++)
{
if(v[i]=='+')
{
pos=i;
break;
}
}
for(ll i=0;i<pos;i++)
{
if(v[i]>'9'||v[i]<'0')
{
flag=0;
break;
}
}
for(ll i=pos+1;i<v.size();i++)
{
if(v[i]>'9'||v[i]<'0')
{
flag=0;
break;
}
}
if(pos==-1||pos==0||pos==v.size()-1||flag==0)
{
cout<<"skipped"<<endl;
continue;
}
else
{
ll v1[10010]={0},v2[10010]={0};
ll cnt1=0,cnt2=0;
for(ll i=pos-1;i>=0;i--)
{
v1[cnt1++]=v[i]-'0';
}
for(ll i=v.size()-1;i>=pos+1;i--)
{
v2[cnt2++]=v[i]-'0';
}
ll v3[10010]={0};
ll lmax=max(cnt1,cnt2);
for(ll i=0;i<lmax;i++)
{
v3[i]=v1[i]+v2[i];
}
for(ll i=0;i<lmax;i++)
{
if(v3[i]>=10)
{
v3[i+1]+=v3[i]/10;
v3[i]%=10;
}
}
if(v3[lmax]==0)
{
for(ll i=lmax-1;i>=0;i--)
{
cout<<v3[i];
}
}
else
{
for(ll i=lmax;i>=0;i--)
{
cout<<v3[i];
}
}
cout<<endl;
}
}
}