当计算两个较大的数的和时,可能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; }