题目描述
实现一个加法器,使其能够输出a+b的值。
输入描述:
输入包括两个数a和b,其中a和b的位数不超过1000位。
输出描述:
可能有多组测试数据,对于每组数据,
输出a+b的值。
示例1
输入
2 6
10000000000000000000 10000000000000000000000000000000
输出
8
10000000000010000000000000000000
解题心得:
- 有一些整数可能非常巨大以致于我们不能使用任何内置整数类型来保存它的值,这就是高精度整数。
- 高精度整数的保存形式
typedef struct bigInteger{
int digit[1000];
int size;
}bigInteger;
这里我们使用每四位为一个单位保存,size为digit数组中第一个我们还没使用过的数组单元。以整数123456789为例,digit[0]=6789,digit[1]=2345,digit[2]=1,size=3。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
typedef struct bigInteger{
int digit[1001];
int size;
}bigInteger;
int main(){
char stra[1001],strb[1001];
while(scanf("%s %s",stra,strb)!=EOF){
bigInteger A,B,R;
int i,j,sum,c;
A.size=0;
B.size=0;
R.size=0;
for(i=0;i<1001;i++){
A.digit[i]=0;
B.digit[i]=0;
}
int lena=strlen(stra),lenb=strlen(strb);
for(i=lena-1,j=0,sum=0,c=1;i>=0;i--){
sum+=c*(stra[i]-'0');
j++;
c*=10;
if(j==4||i==0){
A.digit[A.size++]=sum;
j=0;
c=1;
sum=0;
}
}
for(i=lenb-1,j=0,sum=0,c=1;i>=0;i--){
sum+=c*(strb[i]-'0');
j++;
c*=10;
if(j==4||i==0){
B.digit[B.size++]=sum;
j=0;
c=1;
sum=0;
}
}
int carry=0,tmp;
for(i=0;i<A.size||i<B.size;i++){
tmp=A.digit[i]+B.digit[i]+carry;
R.digit[R.size++]=tmp%10000;
carry=tmp/10000;
}
if(carry>0){
R.digit[R.size++]=carry;
}
for(i=R.size-1;i>=0;i--){
if(i==R.size-1){
printf("%d",R.digit[i]);
}
else{
printf("%04d",R.digit[i]);
}
}
printf("\n");
}
return 0;
}
方若棋盘,圆若棋子,动若棋生,静若棋死。
方若行义,圆若用智,动若聘才,静若得意。
网友评论