c语言大神来QAQ

2025-04-07 06:16:13
推荐回答(1个)
回答1:

#include 
#include 

#define N 201

/* 大数的加减,一般用字符数组完成*/
int main(void)
{
    char num1[N];    // 被减数
    char num2[N];    // 减数
    char diff[N];    // 差值

    int digit;        // 位数
    int i, j, k = 0;
    int len1, len2;
    int borrow = 0; // 借位 

    scanf("%d%s%s", &digit, num1, num2);    // 获取位数,被减数,减数
    len1 = strlen(num1);
    len2 = strlen(num2);

    for (i = len1 - 1, j = len2 - 1; i > -1 && j > -1; i--, j--)
    {
        char exclude_borrow = num1[i] - borrow; // 先减上一次的借位
        if (exclude_borrow < num2[j]) // 不够减,则向高位借 1(其值为 digit 的值)
        {
            diff[k++] = exclude_borrow + digit - num2[j] + '0';
            borrow = 1; // 发生借位,所以需要将借出的值在下一位的运算中减去
        }
        else // 没有借位
        {
            diff[k++] = exclude_borrow - num2[j] + '0';
            borrow = 0;
        }
    }

    /*    始终需要注意,字符运算,最终需要还原成字符,比如 '1' - '1' = '0', 而不是 0。
        所以结果需要加上 '0'
    */

    /* 减数的位数已经减完之后,还有借位需要处理,所以运算没有结束 */
    for (; i > -1; i--)
    {
        if (num1[i] < borrow)
        {
            diff[k++] = num1[i] + digit - borrow;
            borrow = 1;
        }
        else
        {
            diff[k++] = num1[i] - borrow;
            borrow = 0;
        }
    }

    /* 最终结果 diff 是差值的逆序,所以需要做一次反转 */
    for (i = k - 1; i > -1; i--)
    {
        if (diff[i] != '0') // 忽略前面的零,从第一个非零数开始
            break;
    }

    for (; i > -1; i--)
        printf("%c", diff[i]);
    printf("\n");
    return 0;
}