使用陣列實現大整數加法
阿新 • • 發佈:2019-01-08
#include<iostream> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<ctype.h> using namespace std; char* add(const char *arr,const char *brr) { //求兩個加數的較大值即串較長的 int lena=strlen(arr); int lenb=strlen(brr); int maxlen=(lena<lenb)?lenb:lena; /*為計算結果分配儲存空間 較大加數長度maxlen 考慮進位結果長度為 mxlen+1 再考慮上字串結束標誌'\0',所以申請空間大小是malloc(maxlen+2);*/ char* sum=(char*)malloc(maxlen+2); memset(sum,'0',maxlen+1);// 初始化堆記憶體 sum[maxlen+1]='\0'; //字串結束標誌 int cin=0,k=0; //進位初始化為0 while(lena-->0 && lenb-->0) //一直計算到較短字串加數結束 { int left=arr[lena]-'0'; // 字元轉化為數字 int right=brr[lenb]-'0'; // 字元轉化為數字 int s=left+right+cin; cin=s/10; s%=10; sum[k++]=s+'0'; } if(lena<=0) //字串a先結束 { while(lenb-->0) { int left=0; int right=brr[lenb]-'0'; int s=left+right+cin; cin=s/10; //C是進位 s%=10; sum[k++]=s+'0'; } } else if(lenb<=0) { while(lena-->0) { int left=arr[lena]-'0'; int right=0; int s=left+right+cin; cin=s/10; s%=10; sum[k++]=s+'0'; } } /*下邊兩句話的意思是: 如果沒有產生進位,則最高位0多餘不寫入 結果中,長生進位的話則把進位也寫入結果中*/ if(cin!=0) sum[k++]=cin+'0'; //及時新增字串結束標誌給現編字串翻轉函式做準備 sum[k]='\0'; strrev(sum); //字串翻轉 return sum; } int main() { char a[]="20085121428"; //紀念汶川大地震 char b[]="20134200802"; //為雅安地震祈福 char result[100]={0}; memset(result,'0',sizeof(result)); char *p=add(a,b); cout<<"result is "<<p<<endl; free(p); p=NULL; }