【基礎】1005 大數加法
阿新 • • 發佈:2018-11-10
程式碼大部分是相同的,不是很簡潔,原諒我是小白。
程式碼:
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; char ac[10005]; char bc[10005]; int arr[10005]; int brr[10005]; int crr[10005]; int add1(){ int maxv=max(strlen(ac),strlen(bc)); int t=0; for(int i=0;i<maxv+1;i++){ crr[i]=arr[i]+brr[i]+t; if(crr[i]>=10){ t=crr[i]/10; crr[i]=crr[i]%10; }else{ t=0; } } if(crr[maxv]!=0) cout<<crr[maxv]; for(int i=maxv-1;i>=0;i--){ cout<<crr[i]; } cout<<endl; } int sub2(){ //A負 B正 int flag=1; //答案正負,1為正,0為負 if(strlen(ac)-1>strlen(bc)) flag=0; else if(strlen(ac)-1==strlen(bc)){ int i; for(i=0;i<strlen(bc);i++){ if(ac[i+1]>bc[i]){ flag=0; break; } else if(ac[i+1]<bc[i]){ flag=1; break; } } if(i>=strlen(bc)){ cout<<0<<endl; return 0; } }else flag=1; if(flag){ //B大 for(int i=0;i<strlen(bc);i++){ brr[i]-=arr[i]; if(brr[i]<0){ brr[i]+=10; brr[i+1]-=1; } } int len=strlen(bc)-1; while(brr[len]==0) len-=1; for(;len>=0;len--) cout<<brr[len]; }else{ //A大 for(int i=0;i<strlen(ac)-1;i++){ arr[i]-=brr[i]; if(arr[i]<0){ arr[i]+=10; arr[i+1]-=1; } } int len=strlen(ac)-2; cout<<"-"; while(arr[len]==0) len-=1; for(;len>=0;len--) cout<<arr[len]; } } int sub3(){ //A正 B 負 int flag=1; //答案正負,1為正,0為負 if(strlen(ac)>strlen(bc)-1) flag=1; else if(strlen(ac)==strlen(bc)-1){ int i; for(i=0;i<strlen(ac);i++){ if(ac[i]>bc[i+1]){ flag=1; break; } else if(ac[i]<bc[i+1]){ flag=0; break; } } if(i==strlen(ac)){ cout<<0<<endl; return 0; } }else flag=0; // if(flag){ //A大 for(int i=0;i<strlen(ac);i++){ arr[i]-=brr[i]; if(arr[i]<0){ arr[i]+=10; arr[i+1]-=1; } } int len=strlen(ac)-1; while(arr[len]==0) len-=1; for(;len>=0;len--) cout<<arr[len]; }else{ //B大 for(int i=0;i<strlen(bc)-1;i++){ brr[i]-=arr[i]; if(brr[i]<0){ brr[i]+=10; brr[i+1]-=1; } } cout<<"-"; int len=strlen(bc)-2; while(brr[len]==0) len-=1; for(;len>=0;len--) cout<<brr[len]; } } int add4(){ int maxv=max(strlen(ac),strlen(bc)); int t=0; for(int i=0;i<maxv;i++){ crr[i]=arr[i]+brr[i]+t; if(crr[i]>=10){ t=crr[i]/10; crr[i]=crr[i]%10; }else{ t=0; } } cout<<'-'; if(crr[maxv-1]!=0) cout<<crr[maxv-1]; for(int i=maxv-2;i>=0;i--){ cout<<crr[i]; } cout<<endl; } int main(){ scanf("%s",ac); scanf("%s",bc); memset(arr,0,sizeof(arr)); memset(brr,0,sizeof(brr)); memset(crr,0,sizeof(crr)); if(ac[0]!='-'&&bc[0]!='-'){ //A B都為正 int y=0; for(int i=strlen(ac)-1;i>=0;i--){ arr[y++]=ac[i]-'0'; } y=0; for(int i=strlen(bc)-1;i>=0;i--){ brr[y++]=bc[i]-'0'; } add1(); }else if(ac[0]=='-'&&bc[0]!='-'){ //A負 B正 int y=0; for(int i=strlen(ac)-1;i>0;i--){ arr[y++]=ac[i]-'0'; } y=0; for(int i=strlen(bc)-1;i>=0;i--){ brr[y++]=bc[i]-'0'; } sub2(); }else if(ac[0]!='-'&&bc[0]=='-'){ //A正 B負 int y=0; for(int i=strlen(ac)-1;i>=0;i--){ arr[y++]=ac[i]-'0'; } y=0; for(int i=strlen(bc)-1;i>0;i--){ brr[y++]=bc[i]-'0'; } sub3(); }else{ //A B都為負 int y=0; for(int i=strlen(ac)-1;i>0;i--){ arr[y++]=ac[i]-'0'; } y=0; for(int i=strlen(bc)-1;i>0;i--){ brr[y++]=bc[i]-'0'; } add4(); } return 0; }
別人家的:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; char aa[100010],bb[100010]; int a[100010],b[100010],c[100010]; int main() { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); scanf("%s%s",aa,bb); int la=strlen(aa); int lb=strlen(bb); for(int i=la-1,j=0;i>0;i--) //反轉字串(不包含 首個字元); a[j++]=aa[i]-'0'; if(aa[0]=='-') { for(int i=0;i<la-1;i++) //把 首字元 填入a[]陣列中; a[i]=-a[i]; } else a[la-1]=aa[0]-'0'; for(int i=lb-1,j=0;i>0;i--) b[j++]=bb[i]-'0'; if(bb[0]=='-') { for(int i=0;i<lb-1;i++) b[i]=-b[i]; } else b[lb-1]=bb[0]-'0'; int lc=max(la,lb); int p,r=0; for(int i=0;i<lc;i++) { p=a[i]+b[i]+r; r=p/10; c[i]=p%10; } if(r) c[lc++]=r; while(lc>1&&c[lc-1]==0) //略過 前面的0; lc--; int flag=0; if(c[lc-1]>=0) //A,B相加為正; { flag=1; for(int i=0;i<lc;i++) { while(c[i]<0) { c[i+1]--; c[i]+=10; } } } else { flag=-1; for(int i=0;i<lc;i++) { while(c[i]>0) { c[i+1]++; c[i]-=10; } } } if(flag<0) printf("-"); while(lc>1&&c[lc-1]==0) lc--; for(int i=lc-1;i>=0;i--) printf("%d",abs(c[i])); printf("\n"); }
解析:
資料表示:
如果
A輸入為- 1 2 3 4 5,那麼在int a陣列中則用-5 -4 -3 -2 -1 0表示,
B輸入1 2 3 4 5,那麼在 int b陣列中則用 5 4 3 2 1 表示,
資料計算:
用陣列a+陣列b中的每一個元素,注意進位。
判斷c陣列最後一個元素正負確定輸出的正負,並進行進位或退位操作。
最後記得輸出的是abs(c[i]),c[i]的絕對值。考慮A=-111,B=-222,C中是-3-3-3,根據最後一個元素取正負,在取C中每個元素的絕對值。答案-333