一本通1168 高精度加法
Posted 57xmz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一本通1168 高精度加法相关的知识,希望对你有一定的参考价值。
【题目描述】
求两个不超过200位的非负整数的和。
【输入】
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
【输出】
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
【输入样例】
22222222222222222222 33333333333333333333
【输出样例】
55555555555555555555
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
using namespace std;
int main()
{
char a1[210],b1[210];
int a[210],b[210],c[210],lena,lenb,lenc,i,x;
memset(a,0,sizeof(a));//数组清零,相当于a[210]={0}
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
gets(a1);读入两个数用字符的形式,因为200位数已经远远超过了long long
gets(b1);
lena=strlen(a1);//字符串长度用变量表示
lenb=strlen(b1);
for(i=0;i<=lena-1;i++)
{
a[lena-i]=a1[i]-48;//数字的阿斯克码值减去48就是数字本身的值,所以此处是字符变成数字,每一个数字用一维数组来存放。而倒序存放也是为了方便进位,乘法同理
}
for(i=0;i<=lenb-1;i++)
{
b[lenb-i]=b1[i]-48;
}
lenc=1;
x=0;//x表示向上一位进的数,一开始初始化为0
while(lenc<=lena||lenc<=lenb)//两个正整数做加法,结果肯定不会小于任何一个加数
{
c[lenc]=a[lenc]+b[lenc]+x;位数一一对应别忘了加上x
x=c[lenc]/10;//除以10看看是否进位
c[lenc]%=10;//留下小于10的数
lenc++;//计算下一位
}
c[lenc]=x;//最后一位只有x
while(c[lenc]==0)如果后面有0.则删掉
lenc--;
for(int i=lenc;i>=1;i--)
{
cout<<c[i];//因为开始倒序输入,所以输出时反过来,就又是正序了
}
return 0;
}
以上是关于一本通1168 高精度加法的主要内容,如果未能解决你的问题,请参考以下文章