高精度减法

思路:

模拟竖式减法。

同高精度加法。

区别在于进行减法时要判断两数的大小,计算完成后要注意高位的可能有多余的零,要忽略这些零(直接让其长度减1)但要保证结果至少有一位数。

假设第一个数为a,第二个数为b。若a<b记为-1,若a>b记为1,相等则记为0。当结果为-1时,传参数时要把b作为第一个参数,a作为第二个参数,保证接收的第一个参数始终大于第二个参数(假设sub函数规定第一个参数要大于或等于第二个参数)。否则参数顺序不变。

代码:

#include<cstdio>
#include<cstring>

struct bign{
    int d[10100];
    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-1-i]-'0';//字符串转为数字 
    }
    return a;
}

int compare(bign a,bign b){//比较a,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;
        }
    }
    return 0;//两数相等 
}

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]+=10;
            a.d[i+1]--;
        }
        c.d[c.len++]=a.d[i]-b.d[i];
    }
    while(c.len-1>=1 && c.d[c.len-1]==0){
        c.len--;
    }
    return c;
}

void print(bign a){
    for(int i=a.len-1;i>=0;i--){
        printf("%d",a.d[i]);
    }
}

int main(){
    char str1[10100],str2[10100];
    scanf("%s%s",str1,str2);
    bign a=change(str1);
    bign b=change(str2);
    int flag=compare(a,b);
    if(flag==-1){//a小,输出负号,交换a,b,保证函数接收时,a始终大于b 
        printf("-");
        print(sub(b,a));
    }
    else if(flag==1){
        print(sub(a,b));
    }
    else printf("0");//相等直接输出,节约时间 
    return 0;
}
View Code

 

posted @ 2022-04-11 22:47  顾南  阅读(37)  评论(0)    收藏  举报