Поразрядное сложения и вычитания длинных целых чисел, представленных строками символов

  1. Арифметика длинных чисел
  2. Интерфейс простейшего консольного приложения длинной арифметики C#
  3. Сложение длинных чисел (функция для калькулятора)
  4. Вычитание длинных чисел (функция для калькулятора)
  5. Вариант консольного приложения на C++ Visual Studio


Арифметика длинных чисел

Числа, для представления которых в стандартных компьютерных типах данных не хватает количества двоичных разрядов, называются "длинными". Реализация арифметических операций над такими "длинными" числами получила название "длинной арифметики"

Таким образом, остается написать функции поочередной обработки пар цифр (из одинаковых разрядов двух операндов) и при необходимости сохранять и переносить в соседний разряд значение «переноса» (или то, что «на ум пошло», как говорили в первом классе, когда учили складывать и перемножать столбиком).

Конечно, пришлось несколько ограничить ввод для пользователя, чтобы мусор не вводил из озорства…. И кроме того, специальной процедурой корректируются грубые ошибки ввода чисел, например, число не может начинаться с 0, или знак «минус» должен располагаться только перед числом, а не в середине его…



Интерфейс простейшего консольного приложения длинной арифметики C#

  • Введите первое число + Enter;
  • Введите знак операции «+» или «-» и тоже Enter;
  • Введите второе число + Enter;

Интерфейс простейшего консольного приложения длинной арифметики C#
Рис.1        Интерфейс простейшего консольного приложения длинной арифметики C#

Тестирование - это наиболее важный этап в жизненном цикле программного продукта. Поэтому не верьте картинкам, фильмам и сказкам…

Только личное тестирование во всех наиболее сложных сочетаниях данных - должно убедить Вас в доброкачественности алгоритма и исходного кода!

скачать ехе-файл для тестирования



Другие примеры на языке «C#»

Другие примеры на тему «Длинная арифметика»



Сложение длинных чисел (функция для калькулятора)

С++

//------------------------------
char* myAdd (char* st1, char* st2){
    int i, su, ost, carri=0; //сумма, остаток и перенос
    char *s1, *s2;
    int len1 = strlen(st1), len2 = strlen(st2);

    if (len1 >= len2) { s1 = myRevers(st1); s2 = myRevers(st2); }                    //s1 не меньше s2
    else { s1 = myRevers(st2); s2 = myRevers(st1); i = len1; len1 = len2; len2 = i;}

    char* res = new char[len1+1]; //+1 это возможен один перенос в старший разряд

    for (i = 0; i < len1; i++)
    {
         int si1 = s1[i] - 48;
        su = si1 + carri;

         if (i < len2)
         {
            int si2 = s2[i] - 48;
            su += si2;
         }

         carri = su / 10;    //целочисленное деление
          ost = su % 10;
         res[i] = ost + 48;
    }

    if (carri > 0) {res[i] = '1'; res[i+1] = '\0';}//возможнo увеличениe
    else res[i] = '\0';

    return myRevers(res);
}
//------------------------------

Данная функция использует вспомогательную функцию char* myRevers(char* v);, которая просто меняет порядок символов в числе-строке на обратный. Это обязательно! Ведь нам необходимо, чтобы младшие 0,1,2... и так далее разряды в числах при обработке в цикле совпадали.

И еще важно, чтобы число-строка s1 было не меньше s2, т.к. цикл (счетчик цикла) привязан к значению переменной len1. Этим и объясняются 5-6 строки в данной функции.



Вычитание длинных чисел (функция для калькулятора)

С++

//------------------------------
char* mySub(char* st1, char* st2){
    char *rev1, *rev2;//реверсированные строки цифр, причем rev1 > rev2
    int zn = Get_znak_minus(st1,st2);

    if(zn == 0) return Get_Zero();

    if (zn==-1) { rev2 = myRevers(st1); rev1 = myRevers(st2); }
    else { rev1 = myRevers(st1); rev2 = myRevers(st2); }

    char* res = Get_SubReversPositive(rev1,rev2);

    if(zn==-1) res=Get_negative(res);

return res;   
}

//------------------------------

Здесь больше вспомогательных функций.

Функция int Get_znak_minus(char* st1, char* st2); сравнивает числа-параметры и возвращает…

  • 1, если первое число больше и, следовательно, результат будет положительным.
  • 0, если числа равны и, следовательно, результат будет = 0.
  • -1, в противном случае и, следовательно, результат будет отрицательным.

Функция char* Get_SubReversPositive(char* s1, char* s2); вычитает из большего числа-параметра s1 - меньшее s2 и, поэтому всегда возвращает положительное результат разности.

Функция char* Get_negative(char* v); добавляет один разряд в строку и заполняет его символом «минус».



Вариант консольного приложения на C++ Visual Studio


Вариант консольного приложения на C++ Visual Studio
Рис.2        Вариант консольного приложения на C++ Visual Studio

Тестирование - это наиболее важный этап в жизненном цикле программного продукта. Поэтому не верьте картинкам, фильмам и сказкам…

Только личное тестирование во всех наиболее сложных сочетаниях данных - должно убедить Вас в доброкачественности алгоритма и исходного кода!

скачать для Windows 7, 10 exe-файл для тестирования



Другие примеры на языках «C»,«C++»

Другие примеры на тему «Длинная арифметика»





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


исходный код на заказ. orenstudent.ru Автоматизация документов MS Office. orenstudent.ru исходный код на заказ. orenstudent.ru Помогите найти и устранить ошибку в исходном коде программы. orenstudent.ru Skype-консультирование по программированию
Скайп-консультации

Акция !!!
исходный код комментарии цена минимальная


Не попадайтесь на удочку мошенников-кидал...
Сайт помощи студентам по программированию и информатике

Program code