#include<bits/stdc++.h>
using namespace std;
char a[10000000],b[10000000],c[10000001];
int a1[10000000],b1[10000000];
int main(void)
{
scanf("%s %s",a,b);
int lena=strlen(a),lenb=strlen(b);
for(int i=0;i<lena;i++)
{
a[i]-='0';
}
for(int i=0;i<lenb;i++)
{
b[i]-='0';//正序输入
}
int cnt=0;
int x;//x是两段数位数差值
if(lena<lenb)
{
x=lenb-lena;
for(int i=0;i<=lena;i++)
{
a1[lena+x-i+1]=a[lena-i];//正序体现在这,一定要留出第一位
}
for(int i=0;i<lenb;i++)
{
b1[i+1]=b[i];
}
for(int i=lena+x+1;i>0;i--)
{
c[i]=a1[i]+b1[i];
}
}
if(lena>lenb)
{
x=lena-lenb;
for(int i=0;i<=lenb;i++)
{
b1[lenb+x-i+1]=b[lenb-i];
}
for(int i=0;i<lena;i++)
{
a1[i+1]=a[i];
}
for(int i=lenb+x+1;i>0;i--)
{
c[i]=a1[i]+b1[i];
}
}
if(lena==lenb)
{
x=0;
for(int i=0;i<=lena;i++)
{
a1[lena+x-i+1]=a[lena-i];
}
for(int i=0;i<=lenb;i++)
{
b1[lenb+x-i+1]=b[lenb-i];
}
for(int i=lenb+x+1;i>0;i--)
{
c[i]=a1[i]+b1[i];
}
}
int lo=max(lena,lenb)+1;//从哪开始输出,取大值即可
for(int i=lo;i>0;i--)
{
if(c[i]>=10)
{
c[i-1]+=1;
c[i]-=10;
}
}
if(c[0]==0)
{
for(int i=1;i<lo;i++)
{
printf("%d",c[i]);//进位以后就用下面,没进位就用这个
}
}
else
{
for(int i=0;i<lo;i++)
{
printf("%d",c[i]);
}
}
return 0;
}
倒序算法本人觉得看着不舒服(划掉
所以写了个正序加法高精,洛谷已AC P1601
注意,此程序不能处理负号加减,不能处理负数!!
顺便贴个提交后,倒序正序的对比贴图,内存使用是开数组大小的问题。
第一个是倒序,第二个是正序。
本文纯属整活,正规还得是倒序算法。