[演算法筆記 大整數相加]
阿新 • • 發佈:2021-02-03
技術標籤:演算法筆記
[演算法筆記 大整數相加]
Description:
大整數相加,這裡用string輸入,轉為int型別陣列存數,陣列低位存整數的低位(個位存在index=0的地方)
CODE:
#include <cstdio> #include <cstring> const int maxlen=10000; struct Bign{ int data[maxlen]; int len; Bign(){ len=0; memset(data,0,sizeof(data)); } }; void str2bign(char *str,int n,Bign *bign){ for(int i=0;i<n;i++){ bign->data[bign->len++]=str[n-1-i]-'0'; } return; } void add_bign(Bign *b1,Bign *b2,Bign *res){ int carry=0; for(int i=0;i< b1->len || i< b2->len;i++){ int tmp=b1->data[i]+b2->data[i]+carry; carry=tmp/10; res->data[res->len++]=tmp%10; } if(carry!=0){ res->data[res->len++]=carry; } } int main(){ char a[maxlen]={0}; char b[maxlen]={0}; scanf("%s %s",a,b); Bign biga,bigb,res; str2bign(a,strlen(a),&biga); str2bign(b,strlen(b),&bigb); add_bign(&biga,&bigb,&res); for(int i=0;i<res.len;i++) printf("%d",res.data[res.len-i-1]); return 0; }
注意點:
1)對於減法轉化為大數減小數,乘除法轉化為正整數相乘除,再看要不要加負號
2)對於其他四則運算:
a.減法:若不夠減,高位減一,當前位加十,最後需要保證去除高位的0並至少保留最低位
while(c.len-1>=1 && c.d[c.len-1]==0)
c.len--;
b.乘法:大數中的每一位乘以int型別的另一個乘數,個數保留,其餘高位除以10後作為進位,若最後進位不為0,迴圈儲存最後的進位(進位和加法的進位不一樣,可能不止一位)
d.除法:不夠除上0,餘數乘以10加上當前位,作為被除數,同減法,要去除高位的0