1.6编程基础之一维数组 10.大整数加法
描述
求两个不超过200位的非负整数的和。
输入有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。输出一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。样例输入
22222222222222222222
33333333333333333333
样例输出
55555555555555555555
#include<stdio.h>
#include<string.h>
int main()
{
int i,j,str1,str2,k=0; //k用来表示bool值,0假1真
int a1[255],a2[255],a3[255];
char c1[255],c2[255]; //用字符方式存储两个大数的数值
for(i=0; i<255; i++)
{
a1[i]=0; //把int数组内所有数内置为0
a2[i]=0;
}
scanf("%s",c1);
scanf("%s",c2); //用char类型c1,c2存储大数的值
str1=strlen(c1); //用str1表示读入第一个数的长度
str2=strlen(c2); //用str2表示读入第二个数的长度
j=0;
for(i=str1-1; i>=0; i--) //用int类型的数组来来存放大数的位数
a1[j++]=c1[i]-'0';
j=0;
for(i=str2-1; i>=0; i--)
a2[j++]=c2[i]-'0';
for(i=0; i<255; i++) //大数位数相加如果大于10就向前一位数进1
{
a1[i]+=a2[i];
if(a1[i]>=10)
{
a1[i]-=10;
a1[i+1]++;
}
}
//例如a1相加后的结果是1234
j=0; //a1表示就是1234000...000
for(i=254; i>=0; i--) //a3变化后为000...0001234
a3[j++]=a1[i]; //下边目的就是想办法把这些前置的0给消除
for(i=0; i<255; i++)
{
if(a3[i]!=0) k=1; //当从第一位数一直到非0的数我们都不需要打印
if(k==1) printf("%d",a3[i]);//当第一位非0的数出现时候我们把剩下的数打印出来
}
if(k==0) printf("0"); //当输入两个0的时候出现的特殊情况
//不加这行程序不会帮你输出结果0
printf("\n");
return 0;
}