方法一:
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include <map>
#include <set>
#include <vector>
#include <queue>
#define inf 0x3f3f3f3f
#define eps 1e-8
#define pi 3.1415
typedef long long ll;
using namespace std;
int main()
{
char a[1000],a1[1000],b[1000],b1[1000],c[1000],c1[1000];
while(~scanf("%s %s",a1,b1))
{
int len1=strlen(a1);
int len2=strlen(b1);
int k=0,q=0;
for(int i=0; i<len1; i++)//先对读入的数据进行预处理,去掉前导0
{
if(a1[i]=='0'&&i==len1-1)
{
a[0]='0';
a[1]=0;
}
else if(a1[i]!='0')
{
for(int j=len1-1; j>=i; j--)//倒序输入另一个数组,便于计算
{
a[k++]=a1[j];
}
a[k]=0;
break;
}
}
for(int i=0; i<len2; i++)
{
if(b1[i]=='0'&&i==len2-1)
{
b[0]='0';
b[1]=0;//记得每个字符数组要加上\0
}
else if(b1[i]!='0')
{
for(int j=len2-1; j>=i; j--)
{
b[q++]=b1[j];
}
b[q]=0;
break;
}
}
len1=strlen(a);
len2=strlen(b);//将字符更长的放在上面
if(len1<len2)
{
swap(a,b);
swap(len1,len2);
}
for(int i=0; i<900; i++)//初始化c数组,c是存储计算结果
{
c[i]='0';
}
c[900]=0;
for(int i=0; i<len2; i++)//模拟竖式计算
{
if(c[i]-'0'+a[i]+b[i]-'0'-'0'<=9)
{
c[i]+=a[i]+b[i]-'0'-'0';
}
else if(c[i]-'0'+a[i]+b[i]-'0'-'0'>=10)
{
c[i]+=a[i]+b[i]-'0'-'0'-10;
c[i+1]++;
}
}
for(int i=len2; i<len1; i++)
{
if(c[i]+a[i]-'0'-'0'>=10)
{
c[i]='0';
c[i+1]++;
}
else
{
c[i]+=a[i]-'0';
}
}
if(c[len1]=='0')//处理末尾0
{
c[len1]=0;
}
else c[len1+1]=0;
int len=strlen(c);
k=0;
for(int i=len-1; i>=0; i--)//将计算结果转正
{
c1[k++]=c[i];
}
c1[k]=0;
printf("%s\n",c1);
}
return 0;
}
方法二
#include<bits/stdc++.h>
using namespace std;
int x[250],y[250];
int main()
{
string a,b;
int la,lb,l;
getline(cin,a);
getline(cin,b);//读入;
la=a.size();
lb=b.size();
l=max(la,lb);//l是两数和的最大位数;
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());//倒序存储,有助于对其个位 ;
for(int i=0; i<la; i++)
{
x[i]=a[i]-'0';
}
for(int i=0; i<lb; i++)
{
y[i]=b[i]-'0';
}//数字存储;
for(int i=0; i<l; i++)
{
x[i]+=y[i];//对位相加;
if(x[i]>=10)
{
x[i+1]++;
x[i]-=10;
}//处理进位,只需考虑和大于等于十的情况;
}
while(x[l]==0&&l>=1) //和有可能为0,也要输出;
l--;//处理和的首位为0的情况:两个加数开头可以有0;
for(int i=l; i>=0; i--)
{
cout<<x[i];
}//逆序输出;
return 0;
}