大數相加(分正負數)
阿新 • • 發佈:2019-02-06
給出2個大整數A,B,計算A+B的結果。
Input 第1行:大數A
第2行:大數B
(A,B的長度 <= 10000 需注意:A B有可能為負數) Output 輸出A + B Sample Input
Input 第1行:大數A
第2行:大數B
(A,B的長度 <= 10000 需注意:A B有可能為負數) Output 輸出A + B Sample Input
68932147586 468711654886Sample Output
537643802472
#include<stdio.h> #include<string.h> #define N 10005 int a1[N],a2[N]; char s1[N],s2[N]; int main() { int i,j,l; int f1=0,f2=0;//判斷正負0正,1負 scanf("%s %s",&s1,&s2); int l1 = strlen(s1); int l2 = strlen(s2); if (s1[0]=='0' && s2[0]=='0') printf("0\n"); else { if (s1[0]=='-') { f1 = 1; //標記是否為負數 for (i=l1-1,j=0;i>0;i--,j++) a1[j] = s1[i] - '0'; } else for (i=l1-1,j=0;i>=0;i--,j++) a1[j] = s1[i] - '0'; if (s2[0]=='-') { f2 = 1; //標記是否為負數 for (i=l2-1,j=0;i>0;i--,j++) a2[j] = s2[i] - '0'; } else for (i=l2-1,j=0;i>=0;i--,j++) a2[j] = s2[i] - '0'; //CASE 1 全為正; if (!f1 && !f2) { if (l1>l2) l = l1; else l = l2; for (i=0;i<l;i++) { a1[i] += a2[i]; if (a1[i]>9) { a1[i] -= 10; a1[i+1]++; } } while (!a1[l]) l--; for (;l>=0;l--) printf("%d",a1[l]); printf("\n"); } //CSSE 2 一負一正 else if (f1 && !f2)//s1為負數,s2為正數 { int ans = 0;//預設正數大於負數 if (l1-1>l2) ans = 1; //負數大於正數 else if (l1-l2==1) { for (i=l1-2;i>=0;i--) if (a1[i]>a2[i]) { ans = 1; break; } else break; } if (ans) { printf("-"); for (i=0;i<l1;i++) { a1[i] -= a2[i]; if (a1[i]<0) { a1[i] += 10; a1[i+1]--; } } while (!a1[l1]) l1--; for (;l1>=0;l1--) printf("%d",a1[l1]); printf("\n"); } else { for (i=0;i<l2;i++) { a2[i] -= a1[i]; if (a2[i]<0) { a2[i] += 10; a2[i+1]--; } } while (!a2[l2]) l2--; if (l2<0) printf("0");//說明兩數相等 else for (;l2>=0;l2--) printf("%d",a2[l2]); printf("\n"); } } //CASE 3 一正一負 else if (!f1 && f2)//s1為正數,s2為負 { int ans = 0;//預設正數大於負數 if (l2-1>l1) ans = 1; //負數大於正數 else if (l2-l1==1) { for (i=l1-1;i>=0;i--) if (a2[i]>a1[i]) { ans = 1; break; } else break; } if (ans) { printf("-"); for (i=0;i<l2-1;i++) { a2[i] -= a1[i]; if (a2[i]<0) { a2[i] += 10; a2[i+1]--; } } while (!a2[l2]) l2--; for (;l2>=0;l2--) printf("%d",a2[l2]); printf("\n"); } else { for (i=0;i<l1;i++) { a1[i] -= a2[i]; if (a1[i]<0) { a1[i] += 10; a1[i+1]--; } } while (!a1[l1]) l1--; if (l1<0) printf("0");//說明兩數相等 else for (;l1>=0;l1--) printf("%d",a1[l1]); printf("\n"); } } //CSSE 4 全為負 else { if (l1>l2) l = l1; else l = l2; for (i=0;i<l;i++) { a1[i] += a2[i]; if (a1[i]>9) { a1[i] -= 10; a1[i+1]++; } } printf("-"); while (!a1[l]) l--; for (;l>=0;l--) printf("%d",a1[l]); printf("\n"); } } return 0; }