美文网首页
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