1. 程式人生 > 其它 >[演算法筆記 大整數相加]

[演算法筆記 大整數相加]

技術標籤:演算法筆記

[演算法筆記 大整數相加]

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