Загрузка данных



#include <stdio.h>

#define LEN 100

int input(int *buff, int *len);
void output(int *buff, int len);
void sum(int *buff1, int len1, int *buff2, int len2, int *result, int *result_length);
void sub(int *buff1, int len1, int *buff2, int len2, int *result, int *result_length);
void normalize(int *buff, int *len);

int input(int *buff, int *len)
{
    int ch;
    int digit;
    int in_digit = 0;
    int valid = 1;
    int nonzero = 0;

    *len = 0;

    while ((ch = getchar()) != '\n' && ch != EOF)
    {
        if (ch >= '0' && ch <= '9')
        {
            if (in_digit)
                valid = 0;
            else
            {
                digit = ch - '0';
                in_digit = 1;
            }
        }
        else if (ch == ' ' || ch == '\t' || ch == '\r')
        {
            if (in_digit)
            {
                if (*len < LEN)
                {
                    buff[*len] = digit;
                    (*len)++;
                    if (digit != 0)
                        nonzero = 1;
                }
                else
                    valid = 0;

                in_digit = 0;
            }
        }
        else
            valid = 0;
    }

    if (in_digit)
    {
        if (*len < LEN)
        {
            buff[*len] = digit;
            (*len)++;
            if (digit != 0)
                nonzero = 1;
        }
        else
            valid = 0;
    }

    return valid && *len > 0 && nonzero;
}

void normalize(int *buff, int *len)
{
    int i = 0;

    while (i < *len - 1 && buff[i] == 0)
        i++;

    if (i > 0)
    {
        *len -= i;
        for (int j = 0; j < *len; j++)
            buff[j] = buff[j + i];
    }
}

void output(int *buff, int len)
{
    for (int i = 0; i < len; i++)
    {
        if (i > 0)
            printf(" ");
        printf("%d", buff[i]);
    }
    printf("\n");
}

void sum(int *buff1, int len1, int *buff2, int len2,
         int *result, int *result_length)
{
    int i = len1 - 1;
    int j = len2 - 1;
    int carry = 0;
    int digit;
    int temp[LEN + 1];
    int len = 0;

    while (i >= 0 || j >= 0 || carry > 0)
    {
        digit = carry;

        if (i >= 0)
            digit += buff1[i--];
        if (j >= 0)
            digit += buff2[j--];

        temp[len++] = digit % 10;
        carry = digit / 10;
    }

    *result_length = len;

    for (int k = 0; k < len; k++)
        result[k] = temp[len - 1 - k];
}

void sub(int *buff1, int len1, int *buff2, int len2,
         int *result, int *result_length)
{
    int i;
    int j;
    int borrow = 0;
    int digit;
    int temp[LEN];
    int len = 0;

    if (len1 < len2)
    {
        *result_length = -1;
        return;
    }

    if (len1 == len2)
    {
        for (i = 0; i < len1; i++)
        {
            if (buff1[i] < buff2[i])
            {
                *result_length = -1;
                return;
            }
            if (buff1[i] > buff2[i])
                break;
        }
    }

    i = len1 - 1;
    j = len2 - 1;

    while (i >= 0)
    {
        digit = buff1[i] - borrow;

        if (j >= 0)
            digit -= buff2[j];

        borrow = 0;

        if (digit < 0)
        {
            digit += 10;
            borrow = 1;
        }

        temp[len++] = digit;
        i--;
        j--;
    }

    while (len > 1 && temp[len - 1] == 0)
        len--;

    *result_length = len;

    for (int k = 0; k < len; k++)
        result[k] = temp[len - 1 - k];
}

int main(void)
{
    int buff1[LEN];
    int buff2[LEN];
    int result[LEN + 1];
    int len1;
    int len2;
    int result_length;

    if (!input(buff1, &len1) || !input(buff2, &len2))
    {
        printf("n/a\n");
        return 0;
    }

    normalize(buff1, &len1);
    normalize(buff2, &len2);

    sum(buff1, len1, buff2, len2, result, &result_length);
    output(result, result_length);

    sub(buff1, len1, buff2, len2, result, &result_length);

    if (result_length == -1)
        printf("n/a\n");
    else
        output(result, result_length);

    return 0;
}