求a+b的和。
第一行为整数n(n<100),表示下面有n组数据。每组数据一行,分别为两个用空格隔开的数a 和 b,a、b为不超过一百位的整数。
对于每组数据,输出一行,即a+b的和。
3 1 1 260 260 11 22
2 520 33
解题思路:
高精度加法,必须转换为字符串形式来做。满十进一位,从前往后或者从后往前都可以。
#include <stdio.h> #include <string.h> int main() { void add(char a[],char b[],char result[]); void plus(char a[],char b[],char result[]); char a[1000]={0},b[1000]={0},temp1[1000]={0},temp2[1000]={0}; char result[1000]={0},zancun[1000]={0}; int m,i,n; int up,number; scanf("%d",&number); for(up=1;up<=number;up++){ scanf("%s%s",&a,&b); if(a[0]=='-'&&b[0]=='-') {m=0;n=0; for(i=1;a[i]!='\0';i++) temp1[m++]=a[i]; temp1[m]='\0'; for(i=1;b[i]!='\0';i++) temp2[n++]=b[i]; temp2[n]='\0'; add(temp1,temp2,result); printf("-%s\n",result); goto abc; } if(a[0]!='-'&&b[0]!='-') { add(a,b,result); printf("%s\n",result); goto abc; } if(a[0]=='-'&&b[0]!='-') { m=0; n=0; for(i=1;a[i]!='\0';i++) temp2[m++]=a[i]; temp2[m]='\0'; for(i=0;b[i]!='\0';i++) temp1[n++]=b[i]; temp1[n]='\0'; if(m<n) {plus(temp1,temp2,result); printf("%s\n",result); goto abc; } if(m>n) { strcpy(zancun,temp2); strcpy(temp2,temp1); strcpy(temp1,zancun); plus(temp1,temp2,result); printf("-%s\n",result); goto abc; } if(m==n) { if(strcmp(temp1,temp2)==0) {printf("0\n"); goto abc; } if(strcmp(temp1,temp2)<0) {strcpy(zancun,temp2); strcpy(temp2,temp1); strcpy(temp1,zancun); plus(temp1,temp2,result); printf("-%s\n",result); goto abc; } if(strcmp(temp1,temp2)>0) { plus(temp1,temp2,result); printf("%s\n",result); goto abc; } } } if(a[0]!='-'&&b[0]=='-') { m=0; n=0; for(i=0;a[i]!='\0';i++) temp1[m++]=a[i]; temp1[m]='\0'; for(i=1;b[i]!='\0';i++) temp2[n++]=b[i]; temp2[n]='\0'; if(m>n) { plus(temp1,temp2,result); printf("%s\n",result); goto abc; } if(m<n) { strcpy(zancun,temp2); strcpy(temp2,temp1); strcpy(temp1,zancun); plus(temp1,temp2,result); printf("-%s\n",result); goto abc; } if(m==n) { if(strcmp(temp1,temp2)==0) { printf("0\n"); goto abc; } if(strcmp(temp1,temp2)<0) {strcpy(zancun,temp2); strcpy(temp2,temp1); strcpy(temp1,zancun); plus(temp1,temp2,result); printf("-%s\n",result); goto abc; } if(strcmp(temp1,temp2)>0) { plus(temp1,temp2,result); printf("%s\n",result); goto abc; } } } abc: memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(result,0,sizeof(result)); memset(temp1,0,sizeof(temp1)); memset(temp2,0,sizeof(temp2)); memset(zancun,0,sizeof(zancun)); } return 0; } void add(char a[],char b[],char result[]){ int la,lb,lresult; int s,c,t; int i; char temp; la=strlen(a)-1; lb=strlen(b)-1; c=0; t=0; while(la >= 0 || lb >= 0){ if(la < 0) s=b[lb--]-48; else if(lb < 0) s=a[la--]-48; else s=a[la--]-48+b[lb--]-48; result[t++]=(s+c)%10+48; c=(s+c)/10; } if(c != 0) {result[t]=c+48;lresult=t;} else lresult=t-1; for(i=0;i <= lresult/2;i++){ temp=result[i]; result[i]=result[lresult-i]; result[lresult-i]=temp; } } void plus(char temp1[],char temp2[],char result[]){ int la,lb,lresult; int s,c,t=0; int i,j; char temp[1000]={0}; char temp3[1000]={0},temp4[1000]; int length; memset(temp4,'0',sizeof(temp4)); la=strlen(temp1);/*???é?¢?????°?¤§????????????é?¢?????°??*/ lb=strlen(temp2); c=0;s=0; for(i=la-1;i>=0;i--) temp3[c++]=temp1[i]; for(i=lb-1;i>=0;i--) temp4[s++]=temp2[i]; temp[la]='0'; for(i=0;i<la;i++) { if(temp3[i]<temp4[i]) {temp[i]=temp3[i]+10-temp4[i]+'0'; temp3[i+1]--; } if(temp3[i]==temp4[i]) temp[i]='0'; if(temp3[i]>temp4[i]) temp[i]=temp3[i]-temp4[i]+'0'; } for(j=i;j>0;j--) { if(temp[j]=='0') continue; else break; } for(i=j;i>=0;i--) result[t++]=temp[i]; result[t]='\0'; }