大数加减1——将两个数均前后倒置,以对齐最低位

#include <stdio.h>

//将读入的数据存储到num[1]~num[x]中,num[0]表示存入数据的长度。
void read(int num[])
{
    int i;
    char ch;
    for (i = 0; i<500; i++)
        num[i] = 0;
    i = 1;
    while ((ch = getchar()) != '
')
    {
        num[i] = ch - '0';
        i++;
        num[0]++;
    }
}

//将数据num[]中的数翻转,以便计算
void rev(int num[])
{
    int i, t;
    for (i = 1; i <= num[0] / 2;i++)
    {
        t = num[i];
        num[i] = num[num[0] + 1 - i];
        num[num[0] + 1 - i] = t;
    }
}

void print(int num[])
{
    char character[11] = { "0123456789-" };//character[n]表示数字n的字符形式。character[10]='-'用于输出减法结果中的负号。
    int i;
    for (i = 1; i <= num[0]; i++)
        printf("%c", character[num[i]]);
    printf("
");
}

//将a[]和b[]的值相加,存储于sum[]中。
void add(int sum[], int a[], int b[])
{
    //flag为进位标志位。
    int i, flag = 0;
    rev(a);
    rev(b);
    for (i = 1; i <= a[0] || i <= b[0]; i++)
        sum[i] = a[i] + b[i];

    if (a[0] > b[0]) 
        sum[0] = a[0];
    else 
        sum[0] = b[0];

    for (i = 1; i <= sum[0]; i++)
    {
        sum[i] += flag;
        if (sum[i] > 9) 
        {
            sum[i] = sum[i] % 10;
            flag = 1;
        }
        else 
            flag = 0;
    }
    if (1 == flag)
    {
        sum[0] += 1;
        sum[i] = 1;
    }
    rev(sum);
    rev(a);//加法运算完之后,再将a,b翻转回来。
    rev(b);
}

void sub(int rst[], int a[], int b[])
{
    int i;
    int flag = 0;//flag为借位标志位。
    rev(a);
    rev(b);

    for (i = 1; i <= a[0] || i <= b[0]; i++)
        rst[i] = a[i] - b[i];

    if (a[0] > b[0]) 
        rst[0] = a[0];
    else 
        rst[0] = b[0];

    for (i = 1; i <= rst[0]; i++)
    {
        rst[i] += flag;
        if (rst[i] < 0) 
        {
            flag = -1;
            rst[i] += 10;
        }
        else 
            flag = 0;
    }
    if (-1 == flag)
    {
        //此时,flag=-1表示a-b<0,故转换为求b-a。需要先将a,b翻转为原始数据
        rev(a);
        rev(b);
        sub(rst,b,a);
        //进行sub运算后,a,b,rst均为正常形式,需要将其翻转后,再添加负号。
        rev(rst);
        rev(a);
        rev(b);

        //在结果的最高位增加字符‘-’
        rst[0]++;
        rst[rst[0]] = 10;//如果某位为10,则输出时该位为“-”;
    }
    rev(rst);
    rev(a);
    rev(b);
}

int main()
{
    int a[500], b[500], he[500], cha[500];
    printf("Input a:");
    read(a);
    printf("Input b:");
    read(b);

    add(he, a, b);
    sub(cha, a, b);
    print(he);
    print(cha);
    return 0;
}
原文地址:https://www.cnblogs.com/Camilo/p/3831688.html