高精度减法

算法,学习过程中:摒弃形体,留存思想。并不局限于一门语言,设计思维才是需要把握的。

高精度减法,本文选用C++语言,包括一些C语言的库。

储存高精度的数字,必须使用构造数据类型。本文选择数组。

为了方便计算,引入cstring、cstdio、cstdlib。

 

高精度减法的步骤分为:输入、比较、计算、输出

一、输入

char类型数组存储被减数、减数、差

char s1[10100],s2[10100],s3[10100];

 

二、比较

比较被减数与减数的大小,区分我们的符号是正是负。

需要:

返回值为bool类型的compare比较函数,形参char类型的数组str1,str2

1.准备一个compare函数

bool compare(char str1[], char str2[])

2.比较有两种

第一种:位数多少比较

    int len1=strlen(str1);
    int len2=strlen(str2);

比较len1与len2

两种结果,1.位数相同,2位数不同。

第一种情况,位数相同,则进入第二种比较

第二种:对应位上的数大小比较

从高位到低位进行循环,逐一比较。

    int len1=strlen(str1);
    int len2=strlen(str2);

//    位数比较
    if (len1!=len2) return len1>len2;
    for (int i = 0; i < len1; ++i) {
//        每位上的数比较
        if(str1[i] != str2[i]) return str1[i] > str2[i];
    }

3.比较结果的处理

关于被减数与减数是否交换,以及符号的问题

创建全局变量flag记录符号

int flag=0;

借助第三个char数组进行变量交换,借助c语言库中函数strcpy进行交换

//    大小比较,如果s1<s2,交换
    if (!compare(s1,s2)){
        flag=1;
        strcpy(s3,s1);
        strcpy(s1,s2);
        strcpy(s2,s3);
    }

三、计算

转换int数组,考虑借位问题,所以倒序储存

重新获取减数与被减数的位数大小

char类型转换int类型-‘0’

    int la,lb;

    la=strlen(s1);
    lb=strlen(s2);

//    cout << "la=" << la << endl;
//    cout << "lb=" << lb << endl;
//
//    cout << "s1=" << s1 << endl;
//    cout << "s2=" << s2 << endl;

    for (int i = 0; i < la; ++i) {
        a[la-i]=s1[i]-'0';
    }

    for (int j = 0; j < lb; ++j) {
        b[lb-j]=s2[j]-'0';
    }

减法计算中,借位之后,本位的值+=10,高一位的数字-=1

结果存入全局数组 c中

    lc=max(la,lb);

    for (int k = 1; k <= lc; ++k) {
//        cout << "a["<<k<<"]=" << a[k] << endl;
//        cout << "b["<<k<<"]=" << b[k] << endl;
        if (a[k]<b[k]){
            a[k+1]--;
            a[k]+=10;
        }
        c[k]=a[k]-b[k];
    }

最高位的处理

1.最高位的值为0,则消去最高位,再判断下一个位。以此循环。

2.如果结果位数为1,且结果为0,则不需要消去最高位。

while (c[lc]==0 && lc>1) lc--;

 

四、输出

1.符号输出

2.结果数组倒序输出

    if (flag==1) printf("-");

    for (int l = lc; l > 0; --l) {
        printf("%d",c[l]);
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值