[算法笔记 大整数相加]

[算法笔记 大整数相加]

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值