Предмет:
ИнформатикаАвтор:
flowers23#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct bigint
{
char *data;
size_t size;
int neg;
} bigint;
bigint createBigintFromUnsInt(unsigned long int *n)
{
bigint b = {0};
b.neg = 0;
b.size = 0;
b.data = malloc(sizeof(char));
if (*n == 0)
{
b.size = 1;
b.data[0] = 0;
return b;
}
while (*n > 0)
{
b.data = realloc(b.data, ++b.size*sizeof(char));
b.data[b.size - 1] = *n%10;
*n /= 10;
}
return b;
}
bigint createBigintFromInt(long int *n)
{
bigint b = {0};
if (*n < 0)
{
b = createBigintFromUnsInt((unsigned long int*)n);
b.neg = 1;
}
else
{
b = createBigintFromUnsInt((unsigned long int*)n);
}
return b;
}
bigint createBigintFromBI(bigint *bi)
{
bigint b = {0};
b.neg = bi->neg;
b.size = bi->size;
b.data = malloc(b.size * sizeof(char));
memcpy(b.data, bi->data, b.size * sizeof(char));
return b;
}
bigint createBigintFromChar(char *str)
{
bigint b = {0};
if (str[0]=='-')
{
b.neg = 1;
str++;
}
else
{
b.neg = 0;
}
b.size = strlen(str);
b.data = malloc(b.size * sizeof(char));
for (size_t i =0; i < b.size; i++)
{
b.data[i] = str[b.size - 1 - i] - '0';
}
return b;
}
bigint createBigint()
{
bigint b = {0};
b.neg = 0;
b.size = 1;
b.data = malloc(sizeof(char));
b.data[0] = 0;
return b;
}Чтобы добавить математические операции (add, sub, mul, div) к существующей структуре данных "bigint", необходимо создать новые функции для каждой операции и реализовать логику выполнения операции с помощью структуры данных "bigint". Вот пример того, как можно реализовать функцию add:bigint add(const bigint* left, const bigint* right) {
bigint result = createBigint();
result.neg = left->neg;
if (left->neg == right->neg) {
result.size = max(left->size, right->size) + 1;
result.data = malloc(result.size * sizeof(char));
int carry = 0;
for (size_t i = 0; i < result.size; i++) {
int left_digit = (i < left->size) ? left->data[i] : 0;
int right_digit = (i < right->size) ? right->data[i] : 0;
result.data[i] = (left_digit + right_digit + carry) % 10;
carry = (left_digit + right_digit + carry) / 10;
}
} else {
// handle subtraction if one of the numbers is negative
}
return result;
}
Аналогичным образом можно реализовать другие операции, используя этот подход.
Для функции div с остатком можно создать новую функцию с двумя указателями bigint в качестве входных данных, один для делителя, а другой для делимого. Функция должна возвращать коэффициент и хранить остаток в указателе bigint, переданном в функцию.
Важно убедиться в правильности реализации математических операций, протестировав код с различными входными данными и крайними случаями.
Хорошо бы использовать эффективные алгоритмы для математических операций, а не простые итерационные операции.
Автор:
bárbarahmf2Добавить свой ответ
Предмет:
Другие предметыАвтор:
corbinwaltersОтветов:
Смотреть
Предмет:
Английский языкАвтор:
admiralОтветов:
Смотреть
Предмет:
Другие предметыАвтор:
palmerОтветов:
Смотреть