Загрузка данных
#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;
}