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)
{
// ...
}
Си. Калькулятор больших чисел
Пишется под консоль на BC3.1 Заранее огромное спасибо всем откликнувшимся!
Цитата: Cka3o4HuK
Алгоритм его работы я представляю, поразрядное сложение/вычитание/умножение/деление и если бы у меня было больше времени я бы и сам его написал, но времени осталось совсем мало, возможно у кого-то уже есть готовые функции на Си для сложения/умножения/вычитания/деления, особенно интересует деление. И еще, как лучше хранить само число? Я планирую это делать в массиве char, но не знаю как лучше хранить в нем число: в нулевом элементе знак и дальше само число(но тогда возникает проблема с переносом в старший разряд) или хранить число с младшего разряда (т.е. в нулевом индексе единицы, в первом десятки и знак в самом конце), но тогда не удобно будет работать со знаком.
С готовыми функциями на Си помочь не могу - у меня их нет, но могу попробовать подсказать вариант хранения числа.
Можно попробовать реализовать число в виде структуры (struct), в которой задать элементы:
- строка char*, хранящая цифры числа;
- переменная (char или int), хранящая знак числа;
- переменная int, хранящая число, равное количеству цифр числа;
- если числа могут быть дробными - то нужна также переменная int для хранения количества цифр до запятой.
Код:
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);
// ...
}
{
// ...
}
// ...
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);
// ...
}
Число решил хранить в структуре, но знак сохраняю в нулевом элементе чар массива (уже ощутил неудобство такой организации, но пока придерживаюсь ее).
Сейчас реализованы функции ввода числа и преобразования символа в число и наоборот. Очень много времени просидел над сложением чисел и оно почти работает, но есть одна проблема, попробую решить самостоятельно, если не получится, снова обращусь за помощью (
Если всё-таки от вас требуется целочисленная арифметика, то можете посмотреть прикреплённый архив - там модуль (правда, он был написан не мной - приятелем, да и работает он по Builder'ом с использованием VCL, но там недолго переделать на BC3.1), в котором реализован класс длинной арифметики с четырьмя операциями. Надеюсь, это вам поможет :)
Min значение longint = -2147483648
Max значение longint = 2147483647
Что составляет всего 10 десятичных разрядов, а мой калькулятор должен поддерживать числа более 40 десятичных разрядов (число вида 01234567890123456789012345678901234567890123456789)
Но все равно спасибо =)
Написал сложение и вычитание. Все вроде работает, к вечеру надеюсь появится умножение. Код сюда выкладывать не буду, ибо немного стыдно и стремно =) Если кому вдруг интересно пишите сюда или в ПМ.
Вы меня неправильно поняли. Я говорил о том, что брать за базовый тип лучше long int, а не char. Разумеется, число у вас будет представлено не один int'ом, а несколькими. Просто char в 4 раза меньше long int'а, соответственно и быстродействие сильно падает. К тому же, как я понял, у вас одна десятичная цифра представлена одним char'ом - это, конечно, обеспечивает большую простоту для ввода-вывода, но для арифметических операций это очень сильно влияет на производительность в худшую сторону. Всё-таки я бы вам посоветовал глянуть тот код, который я кидал - если вы его использовать и не будете, то в любом случае он может вам с помочь с ещё не реализованными операциями.
Я понял вашу идею, но сделал все кроме деления на чарах. Вопрос скорости работы не стоит, да и на моем компе задержка на выполнение функций не заметна, т.е. результат выдается мгновенно =) Тему в принципе можно закрывать, всем спасибо =)
Ссылка:HugeInt