BigNumber
存储
struct bign{
int d[1000];
int len;
bign(){
memset(d, 0, sizeof(d));
len = 0;
}
};
赋值
bign change(char str[]){
bign a;
a.len = strlen(str);
for(int i=0;i<a.len;i++){
a.d[i]=str[a.len-i-1] - '0';//逆着赋值
}
}
加法
bign add(bign a, bign b){
bign c;
int carry = 0;//进位标志位
for(int i=0;i<a.len||i<b.len;i++){
int temp = a.d[i]+b.d[i]+carry;
c.d[c.len++] = temp%10;
carry=temp/10;
}
if(carry!=0){
c.d[c.len++] = carry;
}
return c;
}
减法
bign sub(bign a, bign b){
bign c;
for(int i=0;i<a.len||i<b.len;i++){
if(a.d[i]<b.d[i]){//不够减,向高位借位
a.d[i+1]--;
a.d[i]+=10;
}
c.d[c.len++] = a.d[i]-b.d[i];
}
while(c.len-1>=1&&c.d[len-1]==0){
//去除最高位0,同时保留一位最低位
c.len--;
}
return c;
}
乘法
bign multi(bign a, int b){
bign c;
int carry=0;
for(int i=0;i<a.len;i++){
int temp = a.d[i]*b + carry;
c.d[c.len++] = temp%10;
carry=temp/10;
}
while(carry!=0){//乘法进位可能不止一位,所以使用while
c.d[c.len++] = carry%10;
carry/=10;
}
return c;
}