• Очень срочно!!!!! Вопрос жизни и смерти! Времени осталось совсем чуть чуть, умоляю, помогите. Даю максимальное количество баллов!!! Язык программирования си. С частью задания мне помогали здесь же, но так получилось, что нужна помощь и со 2 частью. Вот такой код мне помогли написать:#include <stdio.h> #include <stdlib.h> #include <string.h> structure 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; }(если человек, который помог мне с написанием первой части это видит, пожалуйста, помоги мне и со 2, это очень важно)​​

    question img

Ответы 1

  • #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, переданном в функцию.

    Важно убедиться в правильности реализации математических операций, протестировав код с различными входными данными и крайними случаями.

    Хорошо бы использовать эффективные алгоритмы для математических операций, а не простые итерационные операции.

  • Добавить свой ответ

Войти через Google

или

Забыли пароль?

У меня нет аккаунта, я хочу Зарегистрироваться

How much to ban the user?
1 hour 1 day 100 years