之前遇到过几次大数问题,发现竟然不会。
参考了别人的方法,再次做个简单的记录。
无注释
大数定义
struct bign{
int d[1000];
int len;
bign(){
memset(d,0,sizeof(d));
len=0;
}
};
大数输入
bign charge(char str[]){
bign a;
a.len=strlen(str);
for(int i=0;i<a.len;i++){
a.d[i]=str[len-i-1]-'0';
}
return a;
}
大数比较
int cmp(bign a,bign b){
if(a.len>b.len)
return 1;
else if(a.len<b.len)
return -1;
else{
for(int i=a.len-1;i>=0;i--){
if(a.d[i]>b.d[i])
return 1;
else if(a.d[i]<b.d[i])
return -1;
else
continue;
}
}
return 0;
}
大数相加
bign add(bign a,bign b){
bign c;
int carry=0;
for(int i=0;i<a.len||i<b.len;i++){
int tmp=a.d[i]+b.d[i]+carry;
carry=tmp/10;
tmp%=10;
c.d[c.len++]=tmp;
}
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]){
if(a.d[i+1]>0){
a.d[i+1]--;
a.d[i]+=10;
}
}
c.d[c.len++]=a.d[i]-b.d[i];
}
while(c.len>1&&c.d[c.len-1]==0)
c.len--;
return c;
}