2 / 2 / 0
Регистрация: 11.12.2022
Сообщений: 62

Разработать структуру “bigint” для выполнения операций с целыми числами содержащими произвольное количество знаков

11.01.2023, 02:07. Показов 1850. Ответов 7

Студворк — интернет-сервис помощи студентам
Нужна помощь с си! Это срочно, у меня получилось сделать часть, но дальше не получается. Пожалуйста, помогите. Я надеюсь , что здесь найдутся люди, которые действительно разбираются в программировании на си.

ЗАДАНИЕ:

Разработать собственный тип данных (структуру) “bigint” для
выполнения операций с целыми числами содержащими произвольное
количество знаков.
Структура должна соответствовать следующему интерфейсу:
C
1
2
3
4
5
structure bigint {
char *data;
size_t size;
int neg;
}
Реализовать функции, позволяющие инициализировать переменные типа
bigint:
C
1
2
3
4
5
bigint createBigintFromUnsInt(unsigned long int*);
bigint createBigintFromInt(long int*);
bigint createBigintFromBI(bigint*);
bigint createBigintFromChar(char*);
bigint createBigint();
Реализовать операции с bigint:
C
1
2
3
4
5
bigint add(const bigint* left, const bigint* right); // сложение
bigint sub(const bigint* left, const bigint* right); // вычитание
bigint mul(const bigint* left, const bigint* right); // умножение
bigint div(const bigint* left, const bigint* right);  // целочисленное деление
bigint div(const bigint* left, const bigint* right, bigint* res); // деление с остатком
Реализовать функцию вывода:
C
1
void printBigint(const bigint*);


Что получилось у меня:
1.c.zip
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.01.2023, 02:07
Ответы с готовыми решениями:

Разработать тип данных “bigint” для выполнения операций с целыми числами содержащими произвольное количество знаков
Разработать собственный тип данных (структуру) “bigint” для выполнения операций с целыми числами содержащими произвольное количество...

Реализовать в виде класса набор методов для выполнения следующих операций с целыми числами:
Реализовать в виде класса набор методов для выполнения следующих операций с целыми числами: 1) Дано натуральное число N. Если число...

Реализовать в виде класса набор методов для выполнения следующих операций с целыми числами:
Реализовать в виде класса набор методов для выполнения следующих операций с целыми числами: 1) Перестановки в n - значном числе первой и...

7
913 / 339 / 135
Регистрация: 18.07.2017
Сообщений: 1,485
11.01.2023, 13:28
Цитата Сообщение от Good_vin Посмотреть сообщение
Реализовать функции
Не хватает функции которая будет чистить память. Что-то вроде void destroyBigint(bigint number);
Цитата Сообщение от Good_vin Посмотреть сообщение
Что получилось у меня
Не буду я по твоим ссылкам переходить. Выкладывай как код.
Цитата Сообщение от Good_vin Посмотреть сообщение
получилось сделать часть, но дальше не получается
И вместо того чтобы локализовать проблему, описать ее и выложить только тот код который действительно нужен для решения, отбросив все лишнее, ты прото постишь задание целиком, линк в бездну ада и пишешь "памагити, у меня что-то не выходит".

Не по теме:

Цитата Сообщение от Good_vin Посмотреть сообщение
Я надеюсь , что здесь найдутся люди, которые действительно разбираются в программировании на си.
Да нет, этот раздел просто так называется "Язык программирования си", а так мы тут питон обсуждаем
Цитата Сообщение от Good_vin Посмотреть сообщение
Это срочно
Быстро, дешево, качественно. Выбырайте два из трех.

0
2 / 2 / 0
Регистрация: 11.12.2022
Сообщений: 62
11.01.2023, 18:35  [ТС]
assemberist, ок, вот код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#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;
}
Мне нужна помощь в реализации операций с bigint. Я совсем не понимаю как это сделать, буду очень благодарна если сможете помочь хотя бы с написанием
Цитата Сообщение от Good_vin Посмотреть сообщение
bigint add(const bigint* left, const bigint* right); // сложение
и
Цитата Сообщение от Good_vin Посмотреть сообщение
bigint div(const bigint* left, const bigint* right);  // целочисленное деление

не по теме
Добавлено через 3 минуты
Цитата Сообщение от assemberist Посмотреть сообщение
Я надеюсь , что здесь найдутся люди, которые действительно разбираются в программировании на си.
Это я написала, потому что есть люди, которые заходят не помочь а просто "полить желчью" человека за то что он просит помощи
0
913 / 339 / 135
Регистрация: 18.07.2017
Сообщений: 1,485
11.01.2023, 22:57
Цитата Сообщение от Good_vin Посмотреть сообщение
ок, вот код
Тэги, плиз.
Цитата Сообщение от Good_vin Посмотреть сообщение
Мне нужна помощь в реализации операций с bigint.
На этой неделе участвовал в подобной теме: Разработать тип данных “bigint” для выполнения операций с целыми числами содержащими произвольное количество знаков. И опять "Мне надо реализовать функции, тут знает кто си?".
Цитата Сообщение от Good_vin Посмотреть сообщение
Я совсем не понимаю как это сделать, буду очень благодарна если сможете помочь
Нужны реализации для двух конкретных функций, прототипы которых предоставлены в сообщении? Такое описание проблемы уже лучше.
Цитата Сообщение от Good_vin Посмотреть сообщение
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;
}
Глядя на пируэты вроде преинкремента и работы с указателями странно что у тебя возникли проблемы с реализацией.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
bigint add(const bigint* left, const bigint* right){
    // Определяем где большее число.
    const bigint* bigger = left->size > right->size ? left : right;
    const bigint* less = bigger == left ? right : left;
 
    int ovf = 0;
    bigint result = createBigintFromBI(bigger);
    
    size_t i = 0;
    if(left->neg == right->neg){ // Проверяем на разность знаков
        while(i < less->size){
            result->data[i] = bigger->data[i] + bigger->data[i] + ovf;
            ovf = (256 - bigger->data[i] - ovf < less->data[i]) ? 1 : 0; // Проверяем на переполнение
        }
        if(req){ // Если младшие разряды сложили, но остался перенос с прошлой операции.
            while(!++(result->data[i]) && i != bigger->size) i++;
            if(i == bigger->size && result->data == 0){ 
                realloc(result->data, ++(result->size)*sizeof(char);
                result->data[result->size] = 1;
            }
        }
    }
    else{ // Этот блок должен обрабатывать числа с разными знаками.
        
    }
    
    return result;
}
Ну, вот тебе заготовка функции. Здесть только солжение чисел с одинаковым знаком, потому что у меня и так слишком много времени ушло. Соответственно не отлаживал. Но принцип, я думаю, теперь понятен.
Насчет чистки памяти в принципе не так сложно:
C
1
2
3
void destroi_bigint(bigint val){
    free(val->data);
}

Не по теме:

А теперь минутка занимательной математики:
Написать "желчный" коммент - 5-10 минут.
Написать хотя бы одну функцию - полчаса. Еще и отладить - умножай время в 2-3 раза.

0
7 / 6 / 1
Регистрация: 26.12.2019
Сообщений: 52
11.01.2023, 23:14
Доброго времени суток !

Честно говоря, ваш код выглядит странно. Поясню:
1) Почему вы храните число (Bigint) по байтно ?
проще было бы работать с максимальной величиной вашей системы.
2) Всё сильно зависит от компилятора. В gcc для решения вашей задачи можно
использовать __builtin_add_overflow(). И суммировать (вычитать, умножать и делить)
с учётом переноса. Но это решение только для gcc.
3) Если нет встроенных функций учёта переноса, сделать свои на ассемблере.
0
2 / 2 / 0
Регистрация: 11.12.2022
Сообщений: 62
12.01.2023, 01:24  [ТС]
assemberist, благодарю за помощь
0
Заблокирован
12.01.2023, 13:19
а для чего unsigned long int и long int? и то и другое вроде sizeof(...)=4? т.е unsigned/int
удобно все таки в С++ "12345"+"67890"(в смысле сложить строки) запросто, а в "чистом"С столько мороки
0
913 / 339 / 135
Регистрация: 18.07.2017
Сообщений: 1,485
12.01.2023, 14:37
Цитата Сообщение от CoderPC Посмотреть сообщение
а для чего unsigned long int и long int? и то и другое вроде sizeof(...)=4?
Вообще-то, согласно стандарту, минимум 4. В зависимости от реализации может быть и больше.
Точно также с int: по стандарту он минимум 2 байта. И в avr контроллерах он столько и занимает.
5.2.4.2.1 Sizes of integer types <limits.h>
1 The values given below shall be replaced by constant expressions suitable for use in #if
preprocessing directives. Moreover, except for CHAR_BIT and MB_LEN_MAX, the
following shall be replaced by expressions that have the same type as would an
expression that is an object of the corresponding type converted according to the integer
promotions. Their implementation-defined values shall be equal or greater in magnitude
(absolute value) to those shown, with the same sign

— minimum value for an object of type int
INT_MIN -32767 // −(215 − 1)
— maximum value for an object of type int
INT_MAX +32767 // 215 − 1

— minimum value for an object of type long int
LONG_MIN -2147483647 // −(231 − 1)
— maximum value for an object of type long int
LONG_MAX +2147483647 // 231 − 1
— maximum value for an object of type unsigned long int
ULONG_MAX 4294967295 // 232 − 1
Цитата Сообщение от CoderPC Посмотреть сообщение
удобно все таки в С++ "12345"+"67890"(в смысле сложить строки) запросто
Так это конкатенация вроде бы, а не посимвольное сложение с переносом.

Не по теме:

Цитата Сообщение от CoderPC Посмотреть сообщение
а в "чистом"С столько мороки
А у вас компиляция длится вечность и стандартами учитаться можно.
Бе-бе-бе! :р



Добавлено через 1 минуту
Да, это c99, если что.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.01.2023, 14:37
Помогаю со студенческими работами здесь

Реализовать в виде модуля набор подпрограмм для выполнения операций над целыми числами
Реализовать в виде модуля набор подпрограмм для выполне¬ния следующих операций над целыми числами: а) умножения; б) деления; Целое ...

Реализовать в виде класса набор методов для выполнения следующих операций с целыми числами
Реализовать в виде класса набор методов для выполнения следующих операций с целыми числами: Даны натуральные числа n, m. Найти все...

Реализовать в виде класса набор методов для выполнения следующих операций с целыми числами:
Реализовать в виде класса набор методов для выполнения следующих операций с целыми числами: Дано целое n &gt; 2. Напечатать все простые...

Реализовать в виде модуля набор подпрограмм для выполнения следующех операций с целыми числами
1. Процедура определения в n-значном числе суммы цифр десятков и сотен ; 2. Дано натуральное число N. Найти и вывести все числа в...

Класс для выполнения арифметических операций над целыми числами в шестнадцатеричной системе счисления
Помогите разобраться с задачей пожалуйста. Недавно начала изучать классы и не знаю как выполнить эту задачу:( Вот код в котором я пыталась...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

Новые блоги и статьи
50 самых полезных примеров кода Python для частых задач
py-thonny 17.06.2025
Эффективность работы разработчика часто измеряется не количеством написаных строк, а скоростью решения задач. Готовые сниппеты значительно ускоряют разработку, помогают избежать типичных ошибок и. . .
C# и продвинутые приемы работы с БД
stackOverflow 17.06.2025
Каждый . NET разработчик рано или поздно сталкивается с ситуацией, когда привычные методы работы с базами данных превращаются в источник бессонных ночей. Я сам неоднократно попадал в такие ситуации,. . .
Angular: Вопросы и ответы на собеседовании
Reangularity 15.06.2025
Готовишься к техническому интервью по Angular? Я собрал самые распространенные вопросы, с которыми сталкиваются разработчики на собеседованиях в этом году. От базовых концепций до продвинутых. . .
Архитектура Onion в ASP.NET Core MVC
stackOverflow 15.06.2025
Что такое эта "луковая" архитектура? Термин предложил Джеффри Палермо (Jeffrey Palermo) в 2008 году, и с тех пор подход только набирал обороты. Суть проста - представьте себе лук с его. . .
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
С днём независимости России!
Hrethgir 13.06.2025
Решил побеседовать, с утра праздничного дня, с LM о завоеваниях. То что она написала о народе, представителем которого я являюсь сам сначала возмутило меня, но дальше только смешило. Это чисто. . .
Лето вокруг.
kumehtar 13.06.2025
Лето вокруг. Наполненное бурями и ураганами событий. На фоне магии Жизни, священной и вечной, неумелой рукой человека рисуется панорама душевного непокоя. Странные серые краски проникают и. . .
Популярные LM модели ориентированы на увеличение затрат ресурсов пользователями сгенерированного кода (грязь -заслуги чистоплюев).
Hrethgir 12.06.2025
Вообще обратил внимание, что они генерируют код (впрочем так-же ориентированы разработчики чипов даже), чтобы пользователь их использующий уходил в тот или иной убыток. Это достаточно опытные модели,. . .
Топ10 библиотек C для квантовых вычислений
bytestream 12.06.2025
Квантовые вычисления - это та область, где теория встречается с практикой на границе наших знаний о физике. Пока большая часть шума вокруг квантовых компьютеров крутится вокруг языков высокого уровня. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru