Длинная арифметика. Учебная программа, реализующая четыре арифметических действия с длинными числами (Visual Studio C++).

Цитирую:

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

С.М. Окулов      

Если не заморачиваться быстродействием, то одним из наиболее простых и удобных представлений ДЛИННЫХ ЧИСЕЛ будет тип ^System::String, т.е. массив символов цифр.

Понятно, что, в определенные моменты, в строку могут быть допущены кроме цифр еще и символы «знака минус» и «десятичной точки» или «запятой».

Удобство здесь в том, что не надо думать о длине массива. Тип ^System::String обеспечит необходимые размеры массивов, как для операндов, так и для результатов любых вычислений.

А ввести число, превышающее по длине возможности System::String, я думаю ни студенту, ни преподавателю не удастся… . Рука устанет… и учебное время закончится…

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

Несколько сложнее с делением, но по условию задачи при делении результат предоставляется в виде целой части Q (целочисленное деление) и остатка от деления R (тоже целого числа).

Вот, что у меня получилось…

C++ длинная арифметика ихсодный код

Здесь я, для простоты, отказался от дробных чисел (т.е. десятичной запятой), но в принципе доработать программу в этом отношении не составит труда. Было бы желание…

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

Для примера, показываю одну функцию сложения
//суммирует две строки-числа
System::String ^SUM_StringNum(System::String ^st1, System::String ^st2){
    System::String ^res="";
    System::String ^s1, ^s2;

    int i, su, carri=0;    //сумма и перенос

    if(st1->Length > st2->Length)    //s1 не меньше s2
    {
      s1=Revers(st1);
      s2=Revers(st2);
    }
    else
    {
      s1=Revers(st2);
      s2=Revers(st1);
    }

for(i=0;i<(s1->Length);i++)
{ int si1=s1[i]-48;
    if(i<(s2->Length))
    {
       int si2=s2[i]-48;
       su = si1 + si2+ carri;
    }
    else
       su = si1+ carri;

    carri=su/10;    //целочисленное деление
    res+= System::Convert::ToString(su % 10);
}

while (carri>0)     //возможна цепочка увеличений
{
    res+= System::Convert::ToString(carri % 10);
    carri=carri/10;    //целочисленное деление
}

return Revers(res);
}

Как видите, параметрами являются две строки-числа, а результатом - новая строка result (res).

Функция Revers(System::String ^st) является вспомогательной и предназначена для изменения порядка символов в строке на обратный.

Таким образом, после такого реверсирования нулевыми (самыми левыми) символами обоих операндов будут единицы, первыми символами – десятки, далее сотни, тысячи и т.д.

То есть, даже при разной длине чисел-строк ошибки сложения разных (не совпадающих) разрядов между собой практически исключены.

Полученный результат непосредственно в операторе return еще раз реверсируется и, таким образом, возвращается нормальное число-строка.

Еще одна особенность этой функции - это... первый операнд должен быть не короче второго… Или другими словами, вторая строка-число в цикле должна закончиться раньше или одновременно с первой, но не позднее… Для этого в начале функции производится сравнение длин строк-операндов и в некоторых (неудовлетворяющих) случаях они меняются местами.

Удачного Вам тестирования!

скачать exe-файл




Конечно, умножение и деление несколько сложнее, чем сложение, там приходится использовать несколько вспомогательных функций, но зато и решение получается интереснее…

Возможно, кому-то пригодится (понадобится) скайп-консультация…
Готов ответить на вопросы…

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

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




Поделиться в соц сетях:




Если на этой странице не нашлось того, что Вы так искали...

         Не расстраивайтесь, не все потеряно... Смело щелкайте...

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

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


требуются
школьники!


и СТУДЕНТЫ!
Кому не плевать
на деньги!
Сайт помощи студентам по программированию и информатике

Program code