[算法笔记 大整数相加]
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