Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Си. Калькулятор больших чисел

47K
16 января 2010 года
Cka3o4HuK
31 / / 21.10.2009
Понимаю, что тема достаточно объезжена, но все же прошу вашей помощи. Нужно написать калькулятор больших чисел (более 40 десятичных разрядов). Алгоритм его работы я представляю, поразрядное сложение/вычитание/умножение/деление и если бы у меня было больше времени я бы и сам его написал, но времени осталось совсем мало, возможно у кого-то уже есть готовые функции на Си для сложения/умножения/вычитания/деления, особенно интересует деление. И еще, как лучше хранить само число? Я планирую это делать в массиве char, но не знаю как лучше хранить в нем число: в нулевом элементе знак и дальше само число(но тогда возникает проблема с переносом в старший разряд) или хранить число с младшего разряда (т.е. в нулевом индексе единицы, в первом десятки и знак в самом конце), но тогда не удобно будет работать со знаком. очень надеюсь на вашу помощь, хотя бы в плане организации данных и деления.
Пишется под консоль на BC3.1 Заранее огромное спасибо всем откликнувшимся!
12K
16 января 2010 года
Ghox
297 / / 26.07.2009
Цитата: Cka3o4HuK
Алгоритм его работы я представляю, поразрядное сложение/вычитание/умножение/деление и если бы у меня было больше времени я бы и сам его написал, но времени осталось совсем мало, возможно у кого-то уже есть готовые функции на Си для сложения/умножения/вычитания/деления, особенно интересует деление. И еще, как лучше хранить само число? Я планирую это делать в массиве char, но не знаю как лучше хранить в нем число: в нулевом элементе знак и дальше само число(но тогда возникает проблема с переносом в старший разряд) или хранить число с младшего разряда (т.е. в нулевом индексе единицы, в первом десятки и знак в самом конце), но тогда не удобно будет работать со знаком.


С готовыми функциями на Си помочь не могу - у меня их нет, но могу попробовать подсказать вариант хранения числа.

Можно попробовать реализовать число в виде структуры (struct), в которой задать элементы:

  • строка char*, хранящая цифры числа;
  • переменная (char или int), хранящая знак числа;
  • переменная int, хранящая число, равное количеству цифр числа;
  • если числа могут быть дробными - то нужна также переменная int для хранения количества цифр до запятой.
Код:
typedef struct
{
    char *num; // строка для хранения цифр числа
    int sign; // знак числа
    int length; // количество цифр
    int intLength; // количество цифр целой части числа
} Number;

Number addNumbers(Number N1, Number N2)
{
    // ...
}

Number subNumbers(Number N1, Number N2)
{
    // ...
}

Number mulNumbers(Number N1, Number N2)
{
    // ...
}

Number divNumbers(Number N1, Number N2)
{
    // ...
}

Update. Допустим вы хотите сохранить в подобной структуре числа:
100.998
-1234500
Тогда в объекте Number для первого числа будет:
num = "100998", sign = 1, length = 6, intLength = 3
для второго числа:
num = "1234500", sign = 0, length = 7, intLength = 7

Можно написать функцию, которая будут принимать на вход строку char* (напр. "+100.998", "-0.00345", "2010", "-100"), образовывать из нее объект структуры Number и возвращать этот объект как результат выполнения функции:
Код:
Number getNumber(char* numstr, unsigned int size)
{
    // ...
}

// ...

void main()
{
    Number N1, N2, N3, N4;
    // ...
    N1 = getNumber("+100.998", 8);
    N2 = getNumber("-0.00345", 8);
    N3 = getNumber("2010", 4);
    N4 = getNumber("-100", 4);
    // ...
}
47K
18 января 2010 года
Cka3o4HuK
31 / / 21.10.2009
Ghox, спасибо за идеи. Еще в день написания первого сообщения начал в урывки свободного времени писать код.
Число решил хранить в структуре, но знак сохраняю в нулевом элементе чар массива (уже ощутил неудобство такой организации, но пока придерживаюсь ее).
Сейчас реализованы функции ввода числа и преобразования символа в число и наоборот. Очень много времени просидел над сложением чисел и оно почти работает, но есть одна проблема, попробую решить самостоятельно, если не получится, снова обращусь за помощью (
24K
18 января 2010 года
engel65536
50 / / 17.10.2007
А зачем использовать тип char? Не проще ли использовать максимум из аппаратной поддержки - т.е. long int? Тогда и код быстрее будет, и писанины меньше... Другое дело, конечно, если требуется арифметика с плавающей точкой - тогда запары большие, и long int не сильно спасёт.
Если всё-таки от вас требуется целочисленная арифметика, то можете посмотреть прикреплённый архив - там модуль (правда, он был написан не мной - приятелем, да и работает он по Builder'ом с использованием VCL, но там недолго переделать на BC3.1), в котором реализован класс длинной арифметики с четырьмя операциями. Надеюсь, это вам поможет :)
47K
19 января 2010 года
Cka3o4HuK
31 / / 21.10.2009
В 32битной системе
Min значение longint = -2147483648
Max значение longint = 2147483647
Что составляет всего 10 десятичных разрядов, а мой калькулятор должен поддерживать числа более 40 десятичных разрядов (число вида 01234567890123456789012345678901234567890123456789)
Но все равно спасибо =)
47K
19 января 2010 года
Cka3o4HuK
31 / / 21.10.2009
Написал сложение и вычитание. Все вроде работает, к вечеру надеюсь появится умножение. Код сюда выкладывать не буду, ибо немного стыдно и стремно =) Если кому вдруг интересно пишите сюда или в ПМ.
24K
19 января 2010 года
engel65536
50 / / 17.10.2007
Вы меня неправильно поняли. Я говорил о том, что брать за базовый тип лучше long int, а не char. Разумеется, число у вас будет представлено не один int'ом, а несколькими. Просто char в 4 раза меньше long int'а, соответственно и быстродействие сильно падает. К тому же, как я понял, у вас одна десятичная цифра представлена одним char'ом - это, конечно, обеспечивает большую простоту для ввода-вывода, но для арифметических операций это очень сильно влияет на производительность в худшую сторону. Всё-таки я бы вам посоветовал глянуть тот код, который я кидал - если вы его использовать и не будете, то в любом случае он может вам с помочь с ещё не реализованными операциями.
47K
20 января 2010 года
Cka3o4HuK
31 / / 21.10.2009
Я понял вашу идею, но сделал все кроме деления на чарах. Вопрос скорости работы не стоит, да и на моем компе задержка на выполнение функций не заметна, т.е. результат выдается мгновенно =) Тему в принципе можно закрывать, всем спасибо =)
66K
08 декабря 2010 года
fan_cpp
2 / / 08.12.2010
Вот класс сам писал, мне его на экзамен задавали там все подробно розписано что к чему и как его вообще писать, класс OpenSource так что берите на здоровье дописывайте и розпространяйте под лицензией GPL. Удачи
Ссылка:HugeInt
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог