A - 大整数加法
求两个不超过200位的非负整数的和。
Input
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
Output
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
Sample Input
22222222222222222222 33333333333333333333
Sample Output
55555555555555555555
题意:
01 大数加法模拟
题解:
01 ||--求两个不超过200位的非负整数的和--||
说明 只能用数组模拟手算加法
02 ||--输入 可能有多余的前导0--||
逆序处理 方便对齐模拟
03 ||--结果里不能有多余的前导0--||
说明 前导0要特殊处理 同时要提防特殊数据 比如 0+0
04 加法的结果最大为18 可以用char类型的ASCII码值进行模拟 减小内存消耗
AC代码:
// 大整数加法
#include<bits/stdc++.h>
using namespace std;
// 逆序
void my_strrev( char str[] )
{
char *p1=str;
char *p2=str+strlen(str)-1;
char temp;
while( p1<p2 )
{
temp=*p1;
*p1=*p2;
*p2=temp;
p1++;
p2--;
}
}
// 字符转ASCII码值
void convert( char str[] )
{
int i;
for( i=0;str[i];i++ ) str[i]-='0';
}
int main()
{
char a[205],b[205],ans[205];
int alen,blen,len,i,pro;
// 置空 方便反序后处理前导零
memset( a,0,sizeof(a) );
memset( b,0,sizeof(b) );
memset( ans,0,sizeof(ans) );
scanf("%s%s",a,b);
alen=strlen(a);
blen=strlen(b);
len=alen>blen?alen:blen;
// 逆序
my_strrev(a);
my_strrev(b);
// 字符转化为ASCII码值进行计算
convert(a);
convert(b);
// 进位符
pro=0;
// <= 处理最高位的进位
for( i=0;i<=len;i++ )
{
ans[i]=( a[i]+b[i]+pro )%10;
pro=( a[i]+b[i]+pro )/10;
}
// 处理输出的前导0
for( i=len;i>=1 && ans[i]==0;i-- );
for( ;i>=0;i-- ) printf("%d",ans[i]);
printf("\n");
return 0;
}
/**/
个人见解 酌情采纳.