HJ57. 高精度整数加法
描述
输入描述
输入两个字符串。保证字符串只含有'0'~'9'字符
输出描述
输出求和后的结果
示例1
输入:
9876543210 1234567890
输出:
11111111100
C 解法, 执行用时: 1ms, 内存消耗: 340KB, 提交时间: 2021-09-06
#include <stdio.h> int main() { char num1[100],num2[100]; int x[5],y[5]; int z[5]; int a,b,c; int i,j,N1,N2,k,k1,k2,L1,L2,L11,L22,Lm; while(scanf("%s\n%s",num1,num2)!=EOF) { N1=0;N2=0; L1=strlen(num1); k1=L1/8; L11=L1%8; L2=strlen(num2); k2=L2/8; L22=L2%8; for(i=0;i<k1+k2+1;i++) { x[i]=0;y[i]=0;z[i]=0; } for(i=0;i<L11;i++) x[k1]=x[k1]*10+num1[i]-'0'; for(i=0;i<L22;i++) y[k2]=y[k2]*10+num2[i]-'0'; //完整部分 for(N1=1;N1<=k1;N1++) for(i=0;i<8;i++) x[k1-N1]=x[k1-N1]*10+num1[L11+i+(N1-1)*8]-'0'; for(N2=1;N2<=k2;N2++) for(i=0;i<8;i++) y[k2-N2]=y[k2-N2]*10+num2[L22+i+(N2-1)*8]-'0'; // z[N]=x[N]+y[N]; // if(k1>k2) k=k1; else k=k2; for(i=0;i<=k;i++) { z[i]=z[i]+x[i]+y[i]; z[i+1]=z[i]/100000000; z[i]=z[i]%100000000; //printf("%8d",z[i]); } printf("%d",z[k]); for(i=k-1;i>=0;i--) printf("%08d",z[i]); printf("\n"); } return 0; }
C 解法, 执行用时: 1ms, 内存消耗: 348KB, 提交时间: 2021-09-13
#include<stdio.h> void reverse(char *a, int len) { char tmp; int front,rear; front=0;rear=len-1; while(front<rear) { tmp=a[front]; a[front++]=a[rear]; a[rear--]=tmp; } } int main() { char a[10000]={0},b[10000]={0}; int sum=0; char out[10010]={0}; while(scanf("%s\n%s",a,b)!=EOF) { int len1=strlen(a); int len2=strlen(b); reverse(a,len1); reverse(b,len2); int maxlen=(len1>=len2)?len1:len2; int flag=0; for(int i=0;i<=maxlen;i++) { if(i>len1-1) a[i]='0'; if(i>len2-1) b[i]='0'; sum=a[i]-'0'+b[i]-'0'+flag; if(sum>9) { out[i]=sum%10+'0'; flag=1; } else{ out[i]=sum%10+'0'; flag=0; } } if(out[maxlen]=='0') { for(int i=maxlen-1;i>=0;i--) printf("%c",out[i]); } else { for(int i=maxlen;i>=0;i--) printf("%c",out[i]); } printf("\n"); } return 0; }