Сложение и вычитание длинных чисел на СИ
Нужно написать сложение и вычитание длинных чисел, заданных при вводе строкой через 16ричную систему счисления. Я написала перевод в 10ричную систему, для разложения по частям в массив. Теперь не знаю, как написать сложение и вычитание, учитывая знак. Проблема состоит в том, чтоб переносить значения "в уме" в следующий элемент массива, например если у нас обычное число 123 + 921 = 1044, и в один элемент массива бы записалось 1, а в следующий 044. Помогите, пожалуйста (
typedef struct BigInt
{
unsigned int* arr;
int arr_size;
int sign;
}BigInt;
BigInt* translate(char* str)
{
BigInt* res = (BigInt*)malloc(sizeof(BigInt));
res->arr_size = 0;
res->sign = 1;
if (str[0] == '-')
{
res->sign = -1;
str++;
}
if (strlen(str) % 8 != 0)
res->arr_size = strlen(str) / 8 + 1;
else
res->arr_size = strlen(str) / 8;
res->arr = (unsigned int*)malloc(sizeof(unsigned int) * res->arr_size);
memset(res->arr, 0, res->arr_size);
unsigned int result = 0;
int j = res->arr_size - 1;
int k = 0;
for (int i = strlen(str) - 1; i >= 0; i--)
{
int symbol = 0;
if (str[i] >= '0' && str[i] <= '9')
symbol = str[i] - '0';
else if (str[i] >= 'A' && str[i] <= 'F')
symbol = str[i] - 'A' + 10;
else {
printf_s("Invalid character encountered");
system("pause");
return 0;
}
result |= symbol << ((k % 8) * 4);
if ((k % 8 == 0) && (k != 0))
{
res->arr[j] = result;
j--;
result = 0;
}
k++;
}
if (k % 8 != 0)
{
res->arr[j] = result;
j--;
result = 0;
}
return res;
}
void print_big_int(BigInt* big_int)
{
int size = big_int->arr_size;
if (big_int->sign == -1)
printf_s("-");
for (int i = 0; i < size; i++)
{
printf_s("%X", big_int->arr[i]);
}
}
BigInt* adding(BigInt* first, BigInt* second)
{
BigInt* result = (BigInt*)malloc(sizeof(BigInt));
if (first->arr_size >= second->arr_size)
result->arr_size = first->arr_size + 1;
else if (second->arr_size > first->arr_size)
result->arr_size = second->arr_size + 1;
result->arr = (unsigned int*)malloc(sizeof(unsigned int) * (result->arr_size));
if (first->sign == second->sign)
result->sign = first->sign;
return NULL;
}
Источник: Stack Overflow на русском