当计算两个较大的数的和时,可能C语言中的类型诸如int,long,long long型都无法表示时,此时应该换一种思维,将数看成是字符串,采用字符数组的方法进行存储与运算。
同时,应该注意到字符数组的存储方式,在字符数组中,低位地址存放的是字符数组的高位,所以执行加法时,应该从数组下标大的地址开始加。
以下题为例:
Calculate the result of a+b
Line i: two integer a and b seperated by one space
Multiple cases, end with EOF
0<=a,b,(a+b)<=2 63-1
Multiple cases, end with EOF
0<=a,b,(a+b)<=2 63-1
Line i: (a+b)
the corresponding result of a+b
the corresponding result of a+b
可见格式 | 带空格和换行符的格式 | 带空格和换行符的格式说明 |
573247196999136902 1171874011383462059 2093017816426442939 1172643980007319715 2560745550527527105 3566574549894016800
Original | Transformed | 带空格和换行符的格式说明 |
1745121208382598961 3265661796433762654 6127320100421543905
代码如下:
其实本题用不到大数加法的知识,用%llu的格式就足以应对……
#include <stdio.h>
#include <string.h>
int main()
{
char a[66],b[66],c[67]; //输入的两个数存放在数组a,b中,c为输出的结果,同时a,b的长度应尽量大些
int a_length,b_length; //a_length,b_length分别表示输入数字的长度
int flag,i,j,k; //flag为是否进位的标志
int sum;
while(scanf("%s %s",&a,&b)!=EOF){ //输入数据,以EOF为结束的标志
a_length = strlen(a);
b_length = strlen(b);
k = 0;
flag=0;
for(i=a_length-1,j=b_length-1;i>=0&&j>=0;i--,j--) //从数组的高位开始相加
{
sum = a[i]-'0'+b[j]-'0'+flag; //将每个字符转换为数字相加,结果为数字,并判断是否进位
if(sum>=10)
{
sum -= 10;
flag = 1;
}
else flag=0;
c[k] = sum+'0'; //将结果转换为字符存储在c中
k++;
}
while(i>=0) //当a或b某一个计算结束时,用循环处理剩下的
{
sum = a[i]-'0'+flag;
if(sum>=10)
{
sum -= 10;
flag = 1;
}
else flag=0;
c[k] = sum+'0';
i--;
k++;
}
while(j>=0){
sum = b[j]-'0'+flag;
if(sum>=10)
{
sum -= 10;
flag = 1;
}
else flag=0;
c[k] =sum+'0';
j--;
k++;
}
if(flag) //如果最后还有进位,则将k变为1
c[k] = 1+'0';
else k--; //否则将k的值减1
for(;k>=0;k--){
printf("%c",c[k]);
}
printf("\n");
}
return 0;
}