美文网首页
2019-11-17

2019-11-17

作者: 小戴又宁 | 来源:发表于2019-11-17 22:34 被阅读0次

## 大整数题 

整体套路还是字符串模拟 

### 加法

首先判断大数的符号:  

1. 同号相加,异号相减  

```c

//判断符号

    fa = ('-' == A[0]);

    fb = ('-' == B[0]);

    //异号为减,同号为加

    if (fa ^ fb)

        minus(A, B);

    else

        add(A, B);

```

2. 处理同号     

*对同号的处理就是模拟相加*  

模拟就要考虑到加法运算的问题,顺序我们是没法进行正常的逻辑加运算的,  

所以要处理下字符串位置问题进行一个逆序的操作

```c

//翻转字符串

    for (i = fa, j = la - 1; i <= j; ++i, --j) swap(a, i, j);

    for (i = fb, j = lb - 1; i <= j; ++i, --j) swap(b, i, j);

```

开始模拟相加,同时要考虑到相加值溢出的问题

```c

//模拟加法

    for (i = fa; i < la || i < lb; ++i)

    {

        s = a[i] + b[i] + c;

        c = s / 10;

        a[i] = s % 10;

    }

    a[i] = c;

    l = c ? i : i - 1;

```

最后逆序输出,不要忘了符号

```c

//在逆序输出

    if (fa) printf("-");

    for (i = l; i >= fa; --i) printf("%d", a[i]);

```

3. 下面考虑符号相异问题,相异就要考虑两个大数的大小判断,在大小判断基础上再在进行减法的模拟  

 首先处理这两个大数的绝对值大小问题

 ```c

 //判断ab的绝对值大小

int cmp(char* a, char* b)

{

    int i, j, la, lb;

    la = strlen(a);

    lb = strlen(b);

    if (la - fa > lb - fb)

        return 1;

    else if (la - fa < lb - fb)

        return 0;

    else

    {

        for (i = 0; i < la && a[i + fa] == b[i + fb]; ++i);

        return a[i + fa] > b[i + fb];

    }

}

```

同样先进行逆序操作

```c

for (i = fa, j = la - 1; i <= j; ++i, --j) swap(a, i, j);

    for (i = fb, j = lb - 1; i <= j; ++i, --j) swap(b, i, j);

```

模拟减法

```c

//模拟减法

    c = 0;

    l = -1;

    for (i = 0; i + fa < la; ++i)

    {

        s = a[i + fa] - b[i + fb] - c >= 0 ? 0 : 1;

        a[i + fa] = (10 + a[i + fa] - b[i + fb] - c) % 10;

        l = a[i + fa] ? i + fa : l;

        c = s;

    }

```

逆序输出,先判断是否为0的问题

```c

if (l < 0)

        printf("0");

    else

    {

        if (fa) printf("-");

        for (i = l; i >= fa; --i) printf("%d", a[i]);

    }

```

相关文章

网友评论

      本文标题:2019-11-17

      本文链接:https://www.haomeiwen.com/subject/pgmmictx.html