高精度减法

Description

PY has two positive integer a and b. Now he wants to know the value of a - b.

Input

Two lines.

The first line is the integer a, while the second line is the integer b.

(0< a, b < 10100)

Note: 每个数前面没有多余的0。

Output

The value of a-b.

Sample Input 1

999999999

999999999

思路分析:
1. scanf后的字符有如下特性如果输入的时: “123”, 则string【0】 = 1;(这个特性非常重要!)相当于你输入完一串字符后,系统统一收入string内。
2. 基于1的特性,而我们做差时总是从第0位开始比较做差,所以在把字符数组转入数组内时,要转置;(void init 函数实现的功能。)
3. 通过从最大位逐位开始比较两个数组的大小关系,来比较两个大数的大小关系。(int judge函数显示的功能。)
4. 在进入做差函数前,要把较小数不足位的数填为0,这样在后面做差时才不会出错!
5. 做差函数中,result里面最前面为0的部分不用输出,所以用一个while循环去除最前面为0的部分。实际上就是减少lc的值。

#include <stdio.h>
#include <string.h>

int num_a[10000], num_b[10000];
long la, lb;
char temp[10000];

/*scanf后的字符有如下特性如果输入的时: “123”, 则string【0】 = 1;(这个特性非常重要!)相当于你输入完一串字符后,系统统一收入string内。
我们做差时总是从第0位开始比较做差,所以在把字符数组转入数组内时,要转置.*/
void init(int *num_a, long *la) {
    scanf("%s", temp);
    *la = strlen(temp);
    for (int i = 0; i < *la; i++) {
        num_a[i] = temp[*la - i - 1] - '0';
    }
}
/*通过从最大位逐位开始比较两个数组的大小关系,来比较两个大数的大小关系。*/
int judge(int *num_a, int *num_b, long lc) {
    for (long i = lc - 1; i > 0; i--) {
        if (num_a[i] > num_b[i]) {
            return 1;
        } else if (num_a[i] < num_b[i]) {
            return 0;
        }
    }
    return 1;
}


void divd(int *num_a, int *num_b, long lc) {
    int result[10000];
    for (long i = 0; i < lc; i++) {
        result[i] = num_a[i] - num_b[i];
        if (result[i] < 0) {
            result[i] += 10;
            num_a[i + 1]--;
        }
    }
    lc--;
    /*result里面最前面为0的部分不用输出,所以用一个while循环去除最前面为0的部分。实际上就是减少lc的值。*/
    while (lc > 0) {
        if (result[lc] > 0) {
            break;
        }
        lc--;
    }

    while (lc >= 0) {
        printf("%d", result[lc]);
        lc--;
    }
    printf("\n");
}


int main() {
    init(num_a, &la);
    init(num_b, &lb);
    long lc = la > lb ? la : lb;

    /*在进入做差函数前,要把较小数不足位的数填为0,这样在后面做差时才不会出错!*/
    for (long i = la; i < lc; i++) {
        num_a[i] = 0;
    }
    for (long i = lb; i < lc; i++) {
        num_b[i] = 0;
    }

    if (judge(num_a, num_b, lc)) {
        divd(num_a, num_b, lc);
    } else {
        printf("-");
        divd(num_b, num_a, lc);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值